我有一个java套接字客户端应用程序,它通过Socket上的TCP发送数据。它发送的数据是字节数组,可以在不一致时间间隔内发送不一致数据。虽然在特定时间发送的数据本身是完整的,但不会有任何标记用于结束消息。客户端代码无法修改。我必须为服务器创建一个正在运行的线程,以便它在套接字上可用时读取数据。
服务器应用程序工作为 - 另一个类创建服务器套接字并启动传入消息的线程。初始化线程时传递的套接字上的消息的传入消息线程读取。
代码有以下问题。
1)它只读取客户端发送的第一个数据和尝试读取第二次运行的线程退出
2)不能使用线程等待一段时间数据可以在任何时间间隔从客户端发送
3)无法尝试打开和关闭套接字,因为服务器应用程序上的另一个线程将在任何时间间隔向客户端发送数据。
4)不希望代码阻止执行完整的应用程序,因为该应用程序的另一个线程将通过相同的套接字向客户端发送数据。
如有任何进一步的信息,请提供帮助并告知我们。代码如下:
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
public class IncomingMsg extends Thread {
InputStream in =null;
private Socket clientSocket =null;
public IncomingMsg(Socket clientSoc){
this.start();
clientSocket = clientSoc;
}
public void run(){
try {
in = clientSocket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
while (true) {
try {
byte[] data = new byte[100];
int count = in.read(data); //this is where thread exits on second run as new message may not have been received by the time execution reaches this point.
String message = "";
if(count>0)
{
for(int num=0;num<count;num++)
{message = message + " "+ data[num];}
System.out.println("Received Message from IP:"+clientSocket.getInetAddress()+" Message Byte:" +message);
}
data=null;
} catch (Exception e) {
logger.error(this.getClass().getName()+ ": Exception in receiving message "+ e);
}}} }
答案 0 :(得分:0)
给定代码没有问题。问题是客户端应用程序更改本地端口,如果它没有收到任何消息。由于服务器应用程序不发送任何消息,因此客户端的本地端口递增,因此服务器无法在第二次运行时读取数据。如果收到任何进一步的线索,将更新答案。