Java服务器同时处理多个客户端

时间:2017-11-17 16:46:04

标签: java multithreading client java-server

我是java服务器和客户端的新手。我想制作一个多客户端服务器。在使服务器代码准备好接受多个客户端后,它是这样的:

服务器代码:

public class Server {


int clientNumber = 1;
ServerSocket mServer = new ServerSocket(9090);
try {
    while (true) {
        new TheServer(mServer.accept(), clientNumber++).start();
    }
} finally {
    mServer.close();
}
}

private static class TheServer extends Thread {
private Socket client;
private int clientNumber;

public TheServer(Socket client, int clientNumber) {
    this.client = client;
    this.clientNumber = clientNumber;
}

public void run() {

        try {
                DataOutputStream dos = new DataOutputStream(client.getOutputStream());
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(System.in));

                dos.writeUTF(numberString);

                while (true) {
                String message = br.readLine();
                dos.writeUTF(message);
            }

        } catch (IOException e) { }
}

}

客户端按照我的预期添加到服务器中。

如果我有一个客户端,那么--- dos.writeUTF(消息); ---在客户端控制台中提供所需的结果,所以在服务器控制台中我写下(A)并按回车键,然后在#1客户端内打印(A),然后在服务器控制台中写下(B)并按回车键,然后(B)打印在#1客户端内,看起来不错。

但是如果第二个客户端加入服务器,则两个客户端控制台内的结果将按住一次,并在第二次输入时触发。为了简化:在服务器控制台内部我按(A)然后按回车键,客户端控制台上什么也没发生,然后我再次按下(B)在服务器控制台内,现在打印第一条消息(A)和第二条消息(B) (A)#1客户端内部和#2客户端内部的一个(B),这不是我期望的行为。

我的期望:当存在2个客户端并且服务器发送消息(A)时,我需要所有客户端(这里有2个客户端)一起获取消息。想象一下,你在网上玩游戏,如果我有一个角色(比如一个球),我将它移到游戏区域内,所有其他玩家都必须看到我的角色在移动。我希望我很清楚。

我想我必须创建一个数组来保持客户端并向该数组发送消息...

那我怎么解决呢如果需要客户端代码,请告诉我。

1 个答案:

答案 0 :(得分:0)

查看名为“发布 - 订阅”模式的内容,也称为“观察者”模式,这是一个示例:

https://www.journaldev.com/1739/observer-design-pattern-in-java