Java多线程TCP套接字-从客户端接收消息,直到它们断开连接
我有下面的代码来接受来自Java服务器的多个客户端Java多线程TCP套接字-从客户端接收消息,直到它们断开连接,java,c#,multithreading,sockets,tcp,Java,C#,Multithreading,Sockets,Tcp,我有下面的代码来接受来自Java服务器的多个客户端 private class SocketServerThread extends Thread { int count = 0; String error_message = null; @Override public void run() { try{ serverSocket = new ServerSocket(the
private class SocketServerThread extends Thread {
int count = 0;
String error_message = null;
@Override
public void run() {
try{
serverSocket = new ServerSocket(theSocketServerPORT);
while (true){
final Socket socket = serverSocket.accept();
count++;
runOnUiThread(new Runnable(){
@Override
public void run() {
Toast.makeText(getApplicationContext(),"New Client with IP: " + socket.getInetAddress() + " and PORT: " + socket.getPort(),Toast.LENGTH_LONG).show();
}
});
SocketServerListenToMessage socketServerListenToMessage = new SocketServerListenToMessage(socket);
socketServerListenToMessage.run();// Start to Receive now
}
}catch (IOException e){
Log.e("IO ERROR",e.toString());
error_message = "IO ERROR";
}catch (Exception e){
Log.e("EX ERROR",e.toString());
error_message = "EX ERROR";
}
if(error_message!=null){
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),error_message,Toast.LENGTH_LONG).show();
}
});
}
}
}
连接客户端后,我调用SocketServerListenToMessage
开始监听客户端消息
下面的代码用于SocketServerListentMessage
private class SocketServerListenToMessage extends Thread{
Socket theClientSocket;
SocketServerListenToMessage(Socket clientSocketListener){
theClientSocket = clientSocketListener;
Log.w("SERVER STATUS","Starting to Listen to Clients...");
}
@Override
public void run(){
try{
InputStream is = theClientSocket.getInputStream();
while(true){
byte[] lenBytes = new byte[4];
is.read(lenBytes, 0, 4);
int len = (((lenBytes[3] & 0xff) << 24) | ((lenBytes[2] & 0xff) << 16) |
((lenBytes[1] & 0xff) << 8) | (lenBytes[0] & 0xff));
byte[] receivedBytes = new byte[len];
is.read(receivedBytes, 0, len);
final String received = new String(receivedBytes, 0, len);
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),"Client Says: " + received, Toast.LENGTH_LONG).show();
Log.w("Client Says", received);
}
});
}
}catch (IOException e){
Log.e("IO ERR FROM LISTEN MSG", e.toString());
}
catch (Exception e){
Log.e("EX ERR FROM LISTEN MSG", e.toString());
}
}
}
我认为问题出在
SocketServerListentMessage
中的while循环中。我试图删除while循环
,服务器能够从所有客户端接收消息,但每个客户端只有一条消息。我希望服务器侦听客户端的消息,直到它们断开连接。我该怎么做呢?我只是让它工作。多亏了这个
如果我没有弄错的话,从中可以看出,我使用的是单线程。因此,我必须从我的SocketServerThread
中进行更改
SocketServerListenToMessage socketServerListenToMessage = new SocketServerListenToMessage(socket);
socketServerListenToMessage.run();// Start to Receive now
到
并将类SocketServerListentMessage
更改为
private class SocketServerListenToMessage implements Runnable {
protected Socket clientSocket = null;
public SocketServerListenToMessage(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
try {
while (true){
InputStream is = clientSocket.getInputStream();
byte[] lenBytes = new byte[4];
is.read(lenBytes, 0, 4);
int len = (((lenBytes[3] & 0xff) << 24) | ((lenBytes[2] & 0xff) << 16) |
((lenBytes[1] & 0xff) << 8) | (lenBytes[0] & 0xff));
byte[] receivedBytes = new byte[len];
is.read(receivedBytes, 0, len);
final String received = new String(receivedBytes, 0, len);
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Client Says: " + received, Toast.LENGTH_LONG).show();
Log.w("Client Says", received);
}
});
}
} catch (IOException e) {
Log.e("IO ERR FROM LISTEN MSG", e.toString());
} catch (Exception e) {
Log.e("EX ERR FROM LISTEN MSG", e.toString());
} finally {
try{
clientSocket.close();
Log.w("CLIENT DISCONNECTED", "A client is disconnected.");
}catch (IOException e){
Log.w("IO ERR DISCONNECTION", e.toString());
}
}
}
}
私有类SocketServerListentMessage实现可运行{
受保护的套接字clientSocket=null;
公共SocketServerListentMessage(套接字客户端套接字){
this.clientSocket=clientSocket;
}
@凌驾
公开募捐{
试一试{
while(true){
InputStream=clientSocket.getInputStream();
字节[]lenBytes=新字节[4];
is.read(lenBytes,0,4);
int len=((lenBytes[3]&0xff)您遇到了“标准Java读取问题”is.read(buffer)
读取到缓冲区的大小,但它不保证(例如,如果TCP数据流暂停,您可能只获得1个字节)。如果您想读取完整的字节[]
,请务必使用DataInputStream及其方法(…)
@Robert-很抱歉,我对Java不是很在行,你能更具体一点,或者至少展示一个代码示例吗?谢谢你,我非常感谢你的帮助。
new Thread(new SocketServerListenToMessage(socket)).start();
private class SocketServerListenToMessage implements Runnable {
protected Socket clientSocket = null;
public SocketServerListenToMessage(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
try {
while (true){
InputStream is = clientSocket.getInputStream();
byte[] lenBytes = new byte[4];
is.read(lenBytes, 0, 4);
int len = (((lenBytes[3] & 0xff) << 24) | ((lenBytes[2] & 0xff) << 16) |
((lenBytes[1] & 0xff) << 8) | (lenBytes[0] & 0xff));
byte[] receivedBytes = new byte[len];
is.read(receivedBytes, 0, len);
final String received = new String(receivedBytes, 0, len);
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Client Says: " + received, Toast.LENGTH_LONG).show();
Log.w("Client Says", received);
}
});
}
} catch (IOException e) {
Log.e("IO ERR FROM LISTEN MSG", e.toString());
} catch (Exception e) {
Log.e("EX ERR FROM LISTEN MSG", e.toString());
} finally {
try{
clientSocket.close();
Log.w("CLIENT DISCONNECTED", "A client is disconnected.");
}catch (IOException e){
Log.w("IO ERR DISCONNECTION", e.toString());
}
}
}
}