当前位置: 首页 > 知识库问答 >
问题:

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

罗学林
2023-03-14

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

    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

}

有没有简单的方法

监听传入消息

确定消息来自哪个客户端

解析消息等。

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

共有2个答案

樊腾
2023-03-14

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

顺便说一句,如果(clientSocket!=null)没有意义,服务器ocket.accept()永远不会返回null

谯翔
2023-03-14

尝试使用这样的东西:

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);
        }
    }
}
 类似资料:
  • 问题内容: 我是一个优秀的程序员,但是我的网络经验为零。 基本上,我想进入客户端- 服务器网络。例如,我想尝试运行一个服务器进程,该进程允许客户端通过Internet连接并将ping发送到所有其他连接的客户端。然后,也许我将尝试开发一个简单的聊天客户端,或一些简单的多人游戏,然后从那里开始。 我非常了解可能有用的语言:Java,C ++,C。 我该如何开始?我想提前学习最佳实践,因此您可以推荐的良

  • 问题内容: 有什么方法可以使用soap-rpc Web服务,以便通过共享接口生成客户端?宁静的Web服务以这种方式进行操作,但是基于soap的情况又如何呢?您是否总是需要使用Axis或CXF之类的工具来生成存根和代理,还是有可以动态设置的东西? 谢谢。 编辑#1: 为了澄清,我正在寻找做这样的事情: 通用接口: 该公共接口已经可以用于创建服务器端组件。我的问题是: 客户端可以使用这种类型的通用接口

  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

  • 问题内容: 我正在使用RMI编写密码系统的原型。 我有一个问题,因为当我启动两个客户端时,它们从OneTimePad类的服务器中的一个对象获得了响应。 因此客户端A获取为客户端b保留的密钥,由于特定的算法,这种情况不会发生。 服务器仅向客户端发送E和N变量(例如在RSA中),因此我无法序列化OneTimePad对象并通过网络发送它(因为它将具有所有密钥)。 如何为每个客户端创建OneTimePad

  • 问题内容: 我写了一个服务器-客户端通信程序,它运行良好。 客户端模块 服务器模块 上面是单个客户端与服务器通信的代码, 现在我希望多个客户端与该服务器进行交互 。我用谷歌搜索它,发现可以通过使用一个线程让每个客户端与服务器对话来完成它,但是由于我是一个初学者,所以我不知道该如何实现。所以有人请告诉我该怎么做或给我一些想法。 问题答案: MainServer类 助手类

  • 我正在开发一个具有多个客户端的标准java RMI服务器。这些客户机有一个菜单,在那里他们可以调用服务器为他们做各种事情。 一种方法涉及一个队列,他们可以在其中将作业发送到队列并等待它得到处理。RMI服务器自动为所有客户端处理线程,但当涉及到此方法和队列时,我如何阻止此请求,例如: 首先调用客户端1,然后再调用客户端2(此处客户端1应首先从服务器接收消息,客户端2应等待服务器处理客户端1请求所需的