【问题标题】:Networking server with multiple clients in javajava中具有多个客户端的网络服务器
【发布时间】:2013-06-01 01:55:00
【问题描述】:

我正在实现一个可以处理多个客户端的相当简单的服务器,我首先接受这样的客户端

    private static Queue<Player> playerList = new ArrayDeque<Player>(); 

    try {
        serverSocket = new ServerSocket(port);

        // Listen for new clients 
        Socket clientSocket = null;
        int numPlayers = 0;

        while (numPlayers < 2){
            clientSocket = serverSocket.accept();

            if(clientSocket != null){
                // Create a new player 
                Player p = new Player(clientSocket);
                // Add them to the list of players
                playerList.add(p);
            }

        }
    } 
    catch (IOException e) {
        System.out.println("Could not listen on port: " + port);
        System.exit(-1);
    }   

根据我的阅读,似乎通常会为每个客户端创建一个新线程,但如果有更简单的方法,我真的不认为有必要解决这个问题。我只需要能够在服务器和客户端之间发送和接收消息。

while (true) {
    // Check for anything on the buffer

        // Parse message

}

有没有简单的方法

监听传入的消息

确定消息来自哪个客户端

解析消息等

全部在一个循环中而不为每个客户端创建单独的线程?

【问题讨论】:

    标签: java sockets networking


    【解决方案1】:

    尝试使用类似的东西:

    while (true) {
        for(Player p : playerList) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getSocket().getInputStream()));
            String data;
            while ((data = reader.readLine() != null) {
                p.packetRecieved(data);
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      它可以工作。服务器正在处理当前请求时,并发请求将处于等待状态。但是您需要确保客户端准备好处理 ConnectException 并重复请求。传入连接队列有限制(默认为 50,可以更改)。如果队列已满,ServerSocket 将拒绝连接。请参阅 ServerSocket API

      顺便说一句 if(clientSocket != null) 没有意义,serverSocket.accept() 永远不会返回 null

      【讨论】:

      • 很高兴知道!谢谢你的提示。如果没有什么可以接受的,accept 会返回任何东西吗?
      • 不,它会等到它有东西。
      猜你喜欢
      • 2011-12-26
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 2018-09-23
      相关资源
      最近更新 更多