连续 运行ning java 套接字服务器线程在第二个 运行 退出
Continuous running java socket server thread exit on second run
我有一个 java 套接字客户端应用程序,它通过套接字上的 TCP 发送数据。它发送的数据是字节数组,可以在不一致时间间隔内发送不一致数据。尽管在特定时间发送的数据本身是完整的,并且不会有任何消息结束标记。无法修改客户端代码。我必须为服务器创建一个 运行ning 线程,以便它可以在套接字上可用时读取数据。
服务器应用程序作为 - 另一个 class 创建服务器传入消息的套接字和启动线程。传入消息线程读取在初始化线程时传递的套接字上的消息。
该代码存在以下问题。
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);
}}} }
给定的代码没有问题。问题是客户端应用程序在未收到任何消息时更改本地端口。由于服务器应用程序未发送任何消息,客户端的本地端口增加,因此服务器无法在第二个 运行 上读取数据。如果收到进一步的线索,将更新更多答案。
我有一个 java 套接字客户端应用程序,它通过套接字上的 TCP 发送数据。它发送的数据是字节数组,可以在不一致时间间隔内发送不一致数据。尽管在特定时间发送的数据本身是完整的,并且不会有任何消息结束标记。无法修改客户端代码。我必须为服务器创建一个 运行ning 线程,以便它可以在套接字上可用时读取数据。
服务器应用程序作为 - 另一个 class 创建服务器传入消息的套接字和启动线程。传入消息线程读取在初始化线程时传递的套接字上的消息。
该代码存在以下问题。
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);
}}} }
给定的代码没有问题。问题是客户端应用程序在未收到任何消息时更改本地端口。由于服务器应用程序未发送任何消息,客户端的本地端口增加,因此服务器无法在第二个 运行 上读取数据。如果收到进一步的线索,将更新更多答案。