[英]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.