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

使用一台服务器处理多个客户端

马朝斑
2023-03-14

我尝试使用Java中的Sockets连接到多个客户端。一切似乎都正常,但问题是,服务器只监听第一个客户端。如果有多个客户端,服务器可以向它们发送所有消息,但他可以只监听来自第一个客户端的消息。我尝试了所有这些(我从昨天开始就遇到了这个问题)。所以我很确定,错误一定在“ClientListener”类中。

说明:有一个客户端列表(用于与字符串通信的连接)。在GUI中有一个列表,我可以在其中选择要与哪个客户端通信。如果我更改客户端,变量currentClient(int)将切换到另一个数字

networkClients是一个ArrayList,其中“存储”了所有不同的连接。

第一个连接的客户端与其他客户端完全相同,没有什么特别之处。当变量currentClient设置为0(默认值)时,调用他。变量切换正在工作。正如我所说,如果我向所有客户发送订单,他们都会给我回复,但只有网络客户。服务器(ClientListener)听到get(0)。

class ClientListener implements Runnable {
String request;

@Override
public void run() {
  try {
    while (networkClients.size() < 1) {
      Thread.sleep(1000);
    }

    //***I'm pretty sure, that the problem is in this line
    while ((request = networkClients.get(currentClient).getCommunicationReader().readLine()) != null) {
    //***
       myFileList.add(new MyFile(request));
    }
   }
   } catch (Exception e) {
      e.printStackTrace();
   }
}

我希望有人能帮助我。我尝试了很多事情,但都没有成功。

编辑:就像我在代码示例中所写的那样,while循环是否可能无法切换“currentClient”(由另一个线程处理)的数量?我在一个testclass中测试/模拟了一些类似的东西,结果是,while循环当然可以更新其中的状态(这意味着,如果while循环的()中的变量发生变化,那么每次重复后都会对其进行检查)。

共有2个答案

杜阳炎
2023-03-14

我找到了解决方案:

线程位于我在起始帖子(在代码片段中)中提到的声明方法中,并无限制地等待客户端的新响应。因此,更改列表“networkClients”的索引不会做任何事情,因为那里什么都不会发生,直到客户端发送了一个新订单(这让线程走得更远)。

因此,您需要为每个客户端实现一个额外的侦听器。

慕璞
2023-03-14

您应该看看多线程。

您的服务器程序应由以下部分组成:

- The main thread
- A thread that handles new connections.
(Upon creating a new connection, start a new thread and pass the connection on to that thread)
- A thread for each connected client, listening to the each client separately

请看以下示例:(1)(2)

 类似资料:
  • 我有一个Android应用程序,需要允许多个套接字通信。以下是相关的基本工作: 我的应用程序(说服务器)是一个将作为服务器套接字运行的服务。其他应用程序可以在预定义的端口上连接到它。可以有多个连接,例如客户端1、客户端2。 所以,当客户端1发送hello时,服务器将对此进行处理,并应将回复发送回客户端1。 目前我能够连接客户端1和客户端2的服务器。我已经为其创建了输入、输出缓冲区。但我不确定服务器

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

  • 我在Java开发了一个客户端-服务器游戏(称为“Set”)。 在调试过程中遇到了一个非常尴尬的问题: 如果在同一台机器上同时运行客户端和服务器(客户端连接到localhost),这个游戏工作得很棒(如果我运行服务器和大量客户端的话也是如此)。 但是,如果我在两台不同的机器上运行客户端和服务器,那么客户端和服务器都挂起了Inputstream readLine方法。 我会提到我正在使用writeBy

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

  • 最大消息长度为64K字节(尽管我可以将其减少到256字节)。 注意:这将运行在一个微小的嵌入式设备上,所以使用像ZMQ这样的消息传递层不是一个选项(没有足够的内存)。 我可以:

  • 我正在使用谷歌服务帐户将MySQL备份从我们的网络服务器推送到谷歌云端硬盘,使用谷歌API PHP客户端脚本设置为cron作业。 我现在想在多个网络服务器上运行相同的脚本,我不知道如何正确配置服务号,应该吗? > 是否在所有服务器上使用相同的服务帐户和服务帐户密钥/凭据? 或者使用相同的服务帐户,但为每个服务器添加服务帐户密钥/凭据? 还是为每台服务器设置单独的服务帐户?