侦听多个套接字(InputStreamReader)

时间:2011-10-05 12:13:58

标签: java multithreading sockets serversocket

我在课堂上设计的小游戏有问题。 问题是我有两个客户端连接到服务器。 (client1和client2)他们每个人都在运行一个游戏,最终关闭了窗口。由于游戏窗口是JDialog,因此当它关闭时,它将通过套接字向服务器发送消息,告诉它已完成。我希望服务器知道首先完成了两个客户端中的哪一个。他们通过套接字的OutputStream上的PrintWriter进行报告。 我做的是这个:

    in1 = new BufferedReader(new InputStreamReader(client.getInputStream()));
    in2 = new BufferedReader(new InputStreamReader(client2.getInputStream()));
    try {
        in1.readLine();
    } catch (IOException ex) {
        Logger.getLogger(gameServer.class.getName()).log(Level.SEVERE, null, ex);
    }
    try {
        in2.readLine();
    } catch (IOException ex) {
        Logger.getLogger(gameServer.class.getName()).log(Level.SEVERE, null, ex);
    }

问题是它在第二次输入之前等待第一次输入。我怎样才能让它同时听?或者以其他方式解决我的问题。 谢谢!

1 个答案:

答案 0 :(得分:7)

服务器连接应该像这样工作:

Server gameServer = new Server();

ServerSocket server;
try {
    server = new ServerSocket(10100);
    // .. server setting should be done here
} catch (IOException e) {
    System.out.println("Could not start server!");
    return ;
}

while (true) {
    Socket client = null;
    try {
        client = server.accept();
        gameServer.handleConnection(client);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在hanleConnection()中,您启动一​​个新线程并在创建的线程中为该客户端运行通信。然后服务器可以接受新连接(在旧线程中)。

public class Server {
    private ExecutorService executor = Executors.newCachedThreadPool();

    public void handleConnection(Socket client) throws IOException {    
        PlayerConnection newPlayer = new PlayerConnection(this, client);
        this.executor.execute(newPlayer);
    }

    // add methods to handle requests from PlayerConnection
}

PlayerConnection类:

public class PlayerConnection implements Runnable {

    private Server parent;

    private Socket socket;
    private DataOutputStream out;
    private DataInputStream in;

    protected PlayerConnection(Server parent, Socket socket) throws IOException {
        try {
            socket.setSoTimeout(0);
            socket.setKeepAlive(true);
        } catch (SocketException e) {}

        this.parent = parent;
        this.socket = socket;

        this.out    = new DataOutputStream(socket.getOutputStream());;
        this.in     = new DataInputStream(socket.getInputStream());
    }

    @Override
    public void run() {                 
        while(!this.socket.isClosed()) {                        
            try {
                int nextEvent = this.in.readInt();

                switch (nextEvent) {
                    // handle event and inform Server
                }
            } catch (IOException e) {}
        }

        try {
            this.closeConnection();
        } catch (IOException e) {}
    }
}
相关问题