繁体   English   中英

Java Android 中 sockets 的线程同步问题

[英]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. 您应该只有 1 个线程通过套接字发送消息。 如果您有更多,您可能会通过在其中添加另一条消息来增加一条消息。 您可以使用队列按顺序发送消息。

  2. 不要使用Data流! 这是仅限 Java 的,现在已经超出了它的存在多年(它是作为大/小端问题的解决方案而创建的 - 这不再是一个问题)

  3. 您应该为您的通信制定一个消息标准,例如 HTTP header 如何拥有有关发送内容的信息。 我建议使用 XML 或 JSON 来构建您的消息(这就是我在 Sockets 和 WebSockets 上做的方式)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM