【发布时间】: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