[英]Problem in Thread synchronization for sockets in Java Android
我正在向 PLC 写入两种类型的数据包,PLC 通过为每种类型的输入数据包发送不同的数据包来响应。 我正在使用带有两个不同线程的套接字 class 来实现这一点,即一个线程来处理一种类型的消息。 由于在 sockets 收到的消息/数据包可以来自任何线程,因此难以同步并完成必要的任务。
有两种类型的字节数据需要发送到 PLC 套接字,即 ByteFrame1 和 ByteFrame2。 发送数据包后会收到不同的响应。
以下代码片段显示了线程 1。
Thread workerThread1 = new Thread() {
@Override
public void run() {
try {
dos = new DataOutputStream(socket.getOutputStream());
while (socket.isConnected()) {
dos.write(ByteFrame1);
try {
DataInputStream dis = new DataInputStream(socket.getInputStream());
readLength = dis.read(OutputBytes1, 0, receiveBufferSize1);
//Interpret OutputBytes1 code follows
第二个线程的类似代码片段如下:
Thread workerThread2 = new Thread() {
@Override
public void run() {
try {
dos = new DataOutputStream(socket.getOutputStream());
while (socket.isConnected()) {
dos.write(ByteFrame2);
try {
DataInputStream dis = new DataInputStream(socket.getInputStream());
readLength = dis.read(OutputBytes2, 0, receiveBufferSize2);
//Interpret OutputBytes2 code follows
我发现两个线程都收到了一些难以解释的乱码数据。 可能的原因可能是由于线程乱序执行而导致套接字接收不同步。 如何在每个线程上实现同步,以便每个线程收到的响应不会混淆?
好的,这里有几件事。
您应该只有 1 个线程通过套接字发送消息。 如果您有更多,您可能会通过在其中添加另一条消息来增加一条消息。 您可以使用队列按顺序发送消息。
不要使用Data
流! 这是仅限 Java 的,现在已经超出了它的存在多年(它是作为大/小端问题的解决方案而创建的 - 这不再是一个问题)
您应该为您的通信制定一个消息标准,例如 HTTP header 如何拥有有关发送内容的信息。 我建议使用 XML 或 JSON 来构建您的消息(这就是我在 Sockets 和 WebSockets 上做的方式)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.