java - 从套接字接收到的消息数

标签 java sockets

我正在为聊天客户端-服务器应用程序编写一个测试,我创建了 10 个套接字 - 每个套接字都向其他 9 个套接字发送一条消息,这会触发服务器通过 ExecutorService 创建 10 个线程并发送消息。发送所有 10*9=90 条消息需要一些时间,但是我如何验证所有 10 个线程都已完成这项工作(线程没有终止,它们继续运行)。我想知道是否可能是从一个套接字并在该条件下等待,直到每个套接字达到 9 个接收到的消息,如果不是,我该怎么办?而且我不应该修改客户端和聊天代码,但是我可以自由地在测试中编写任何内容,以下是我如何创建 10 个套接字并将消息发送到当然已启动的服务器:

  for (int i = 0; i < 10; i++) {
        try {
        Socket socket = new Socket("127.0.0.1", 3000);
        allsockets.add(socket);
        final PrintWriter stream = new PrintWriter(socket.getOutputStream(), true);
        stream.println("someMessage");
        } catch (IOException e) {
        e.printStackTrace();
        }
     }

最佳答案

这是一个非常专业的问题,但考虑到您提供的信息,使用 volatile 变量可能是值得的。

public static volatile int messagesReceived = 0;

使用关键字 volatile 意味着JVM使用lock 以确保一次只有一个线程可以修改该变量。

然后,每个套接字在完成其工作后都应增加此 messagesReceived 变量。一旦 messagesReceived 变量达到 10,或者您生成的线程数,那么您就可以确定它们都已完成该工作。

//Your initialization here.
while (messagesReceived < threadCount){
    Thread.wait(100);
}
//All threads have done the job.

但是,根据套接字的实现,可能有必要允许它们访问增加计数器变量的公共(public)变元方法。

关于java - 从套接字接收到的消息数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49804311/

相关文章:

c - 需要声明不相关的字符数组以避免程序卡住

java - 如何调用 MitreID OIDC 服务器?

java - 如何调用 JFrame 并设置外观?

java - 当框架是Hybrid并且测试用例由Selenium中的excel驱动时,如何使用TestNG注释?

java - 如何在不泄露任何安全信息或堆栈跟踪的情况下记录错误?

c - tcp时间戳,记录返回回复所需的时间

java - 如何在普通java项目中导入android.os.bundle格式?

java - 使用比较器对数组列表进行排序

swift - TCP 套接字流和 SSL 与 Swift

sockets - 检查 socket 是否仍然打开而没有阻塞