Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多线程TCP套接字-从客户端接收消息,直到它们断开连接_Java_C#_Multithreading_Sockets_Tcp - Fatal编程技术网

Java多线程TCP套接字-从客户端接收消息,直到它们断开连接

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

我有下面的代码来接受来自Java服务器的多个客户端

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());
                }
            }
        }
    }