簡體   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