【问题标题】:Problem in Thread synchronization for sockets in Java AndroidJava Android中套接字的线程同步问题
【发布时间】:2022-01-20 21:31:44
【问题描述】:

我正在向 PLC 写入两种类型的数据包,PLC 通过为每种类型的输入数据包发送不同的数据包来响应。我正在使用带有两个不同线程的套接字类来实现这一点,即一个线程来处理一种类型的消息。由于在套接字处接收到的消息/数据包可以来自任何线程,因此难以同步并完成必要的任务。

有两种类型的字节数据需要发送到 PLC 套接字,即 ByteFrame1 和 ByteFrame2。发送数据包后会收到不同的响应。

以下代码 sn-p 显示线程 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

第二个线程的类似代码sn-p如下:

 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

我发现两个线程都在接收一些难以解释的乱码数据。可能的原因可能是由于线程乱序执行而导致套接字接收不同步。如何实现每个线程的同步,使每个线程收到的响应不被混淆?

【问题讨论】:

  • 您可能还想知道 TCP 不处理“消息”或“数据包”。它提供字节流。这意味着一侧的“接收”不需要匹配另一侧的“发送”。唯一的保证是字节按顺序到达那里,或者连接失败。如果你想要消息,你需要一个协议来实现它们(例如,“直到下一个行尾字符”,或者“前两个字节给出消息的长度”)。

标签: java multithreading sockets synchronization datainputstream


【解决方案1】:

好的,这里有几件事。

  1. 您应该只有 1 个线程通过套接字发送消息。如果您有更多,您可能会通过在其中添加另一条消息来增加一条消息。您可以使用队列顺序发送消息。

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

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

【讨论】:

  • IDK 关于只有一个线程通过套接字发送,但我绝对永远不会从套接字接收线程超过一个。
  • 我有一个正确的数据包,其中有开始和停止代码。您提到不要使用数据流。那么有什么更好的选择呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多