3

我正在创建一个基于 UDP 的聊天客户端。主要结构是有一个客户端注册的服务器,客户端也可以请求与另一个在服务器上注册的客户端建立连接。客户端是使用伪代码的结构如下:

public UDPClient() {
    // Create datagram socket

    // Execute RECEIVE thread using datagram socket above
    // Execute SEND thread using datagram socket above
}

这个想法是让发送和接收在不同的线程上执行,这样我就不会在接收时被阻塞 I/O。这两个线程在它们的运行方法中都有循环,允许您不断地发送和接收消息。我遇到的问题是这个。如果接收线程上的消息改变了我的 SEND 应该如何执行,我如何将它传达给 SEND 线程?我是否必须向自己发送数据报,或者我可以以某种方式在代码中传达这个信息?

4

3 回答 3

1

您的 SEND 线程应该具有公共(可访问)方法(如果可能,同步),您应该能够从您的 RECEIVE 线程访问。您可以使用此方法创建一个布尔标志、字符串消息等,您应该始终在 .send(yourPacket); 之前阅读它们。从你的发送线程。

于 2012-10-12T17:47:07.937 回答
1

假设两个线程没有相互引用,创建第三个单例类,它都读取/发送线程(类)引用,它有一个volatile成员字段来存储您想要共享的状态数据并且可以synchronized访问。

关键字与同步访问相结合,volatile保证一个线程对字段所做的更改将被另一个线程看到。没有这个,由于 java 内存模型规范,更改可能不可见。

编辑:

遵循“关注点分离”设计指南,最好不要让读取/发送线程相互了解,并使用第三类来协调它们的活动/行为。将方法添加到您的读取/发送类到stop()start(),并从其他类调用这些。

使用单独的类还允许:

  • 通过其他方式进行行为控制,例如管理网页上的“停止发送”按钮
  • 允许每种类型的多个线程,但仍然可以通过中心点进行适当的控制,可能使用这样的线程池(如果没有单独的类,您将面临多对多的噩梦和大量与无关的代码手头的工作:即结束和接收)
  • 更容易测试你的工人阶级,因为他们做的更少,更专注
  • 将它们独立移植/嵌入以供其他用途
于 2012-10-12T17:53:56.833 回答
0

在您的 READ 方法中有一个成员变量,您的代码可以从中读取并根据该变量更改 SEND 方法。

于 2012-10-12T17:37:00.953 回答