如何在其他线程中移动服务器代码

时间:2014-01-15 14:07:25

标签: java multithreading sockets client-server

我遇到多线程服务器的问题。我想将多个客户端连接到此服务器,但我不知道如何在新线程中提供所有参数。

import java.net.*;
import java.io.*;

class AffableThread extends Thread implements Runnable
{
    public Socket client;

    public AffableThread(Socket client) {

        PrintWriter out = null;
        BufferedReader in = null;
        in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
        out = new PrintWriter(client.getOutputStream(),true);
        String input, output;
        while ((input = in.readLine()) != null) {
            if (input.equalsIgnoreCase("exit")) {
                break;
            }
            out.println("Server:" + input);
            System.out.println(input);
        }
        out.close();
        in.close();
        client.close();
    }
}

public class Server {

    static AffableThread mSecondThread;

    public static void main(String[] args) {
        try{
        ServerSocket server = null;
        Socket client;

        server = new ServerSocket(1234);
        client = server.accept();
        System.out.println("wait"); 
        String abc = "13";
        Runnable r = new AffableThread(client);
        server.close();
        System.out.println("Server closed");
    } catch(Exception e){
        System.out.println(e.getMessage());
    }
    }
}

这是一个日志

Server.java:15: error: unreported exception IOException; must be caught or declared to be thrown
        in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
                                                                           ^
Server.java:16: error: unreported exception IOException; must be caught or declared to be thrown
        out = new PrintWriter(client.getOutputStream(),true);
                                                    ^
Server.java:18: error: unreported exception IOException; must be caught or declared to be thrown
        while ((input = in.readLine()) != null) {
                                   ^
Server.java:28: error: unreported exception IOException; must be caught or declared to be thrown
        in.close();
                ^
Server.java:29: error: unreported exception IOException; must be caught or declared to be thrown
        client.close();
                    ^
5 errors

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您似乎在构造函数中嵌入了所有run逻辑。显然,这实际上不会在新线程中运行,而是需要类似这样的东西

class AffableThread extends Thread implements Runnable {
    private final Socket client;

    public AffableThread(Socket client) {
        this.client = client;
    }

    @Override
    public void run() {
        PrintWriter out = null;
        BufferedReader in = null;
        try {
            in = new BufferedReader(new InputStreamReader(
                    client.getInputStream()));
            out = new PrintWriter(client.getOutputStream(), true);
            String input, output;
            while ((input = in.readLine()) != null) {
                if (input.equalsIgnoreCase("exit")) {
                    break;
                }
                out.println("Server:" + input);
                System.out.println(input);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            out.flush();
            out.close();
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

然后,在你的main方法中启动线程;像这样

Runnable r = new AffableThread(client);
r.start(); // <-- Start the thread executing.