java中具有多个客户端的网络服务器

Posted

技术标签:

【中文标题】java中具有多个客户端的网络服务器【英文标题】:Networking server with multiple clients in java 【发布时间】: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


有没有简单的方法

监听传入的消息

确定消息来自哪个客户端

解析消息等

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

【问题讨论】:

【参考方案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 会返回任何东西吗? 不,它会等到它有东西。

以上是关于java中具有多个客户端的网络服务器的主要内容,如果未能解决你的问题,请参考以下文章

Java 网络编程:案例四:多个客户端群聊

Java 网络编程案例二:多态客户端与服务器之间的多次通信

java网络编程——多线程数据收发并行

Java 网络 IO 模型

Java网络编程之UDP和TCP套接字

Java网络编程 - 服务器端和客户端的连接和信息传递实现