从服务器套接字java中的客户端获取数据

Sha*_*ggy 2 java sockets serversocket

我正在创建一个服务器应用程序,它执行以下任务

  • 接受客户端的连接
  • 处理每个客户端连接到单独的线程
  • 从客户端接收数据
  • 将数据发送到客户端

我能够连接客户端但无法从客户端接收数据

只有当客户端断开连接时才能在我的控制台中看到数据.. !!!

代码: -

public class ServerListener {

    public static void main(String[] args) {
        new ServerListener().startServer();
    }

    public void startServer() {
        final ExecutorService clientProcessingPool = Executors
                .newFixedThreadPool(10);

        Runnable serverTask = new Runnable() {
            @Override
            public void run() {
                try {
                    ServerSocket serverSocket = new ServerSocket(8000);
                    System.out.println("Waiting for clients to connect...");
                    while (true) {
                        Socket clientSocket = serverSocket.accept();
                        clientProcessingPool
                                .submit(new ClientTask(clientSocket));
                    }
                } catch (IOException e) {
                    System.err.println("Unable to process client request");
                    e.printStackTrace();
                }
            }
        };
        Thread serverThread = new Thread(serverTask);
        serverThread.start();
    }

    private class ClientTask implements Runnable {
        private final Socket clientSocket;

        private ClientTask(Socket clientSocket) {
            this.clientSocket = clientSocket;
        }

        @Override
        public void run() {
            System.out.println("Got a client !");
            try {
            /* Get Data From Client */
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(clientSocket.getInputStream()));
                String clientData = "";
                clientData = reader.readLine();
                System.out.println("Data From Client :" + clientData);

            /* Send Data To Client */

                //Code

                clientSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

lin*_*ski 7

您的实施有问题

BufferedReader#readLine:

读一行文字.一条线被认为是由换行符('\n'),回车符('\ r')或回车符中的任何一个终止,后面紧跟换行符.

换句话说,如果您的客户端没有发送\n\r字符,那么该方法将不会结束,直到IOException因断开连接而被抛出.

替换此代码:

BufferedReader reader = new BufferedReader(
                    new InputStreamReader(clientSocket.getInputStream()));
String clientData = "";
clientData = reader.readLine();
Run Code Online (Sandbox Code Playgroud)

有:

int red = -1;
byte[] buffer = new byte[5*1024]; // a read buffer of 5KiB
byte[] redData;
StringBuilder clientData = new StringBuilder();
String redDataText;
while ((red = clientSocket.getInputStream().read(buffer)) > -1) {
    redData = new byte[red];
    System.arraycopy(buffer, 0, redData, 0, red);
    redDataText = new String(redData,"UTF-8"); // assumption that client sends data UTF-8 encoded
    System.out.println("message part recieved:" + redDataText); 
    clientData.append(redDataText);
}
System.out.println("Data From Client :" + clientData.toString());
Run Code Online (Sandbox Code Playgroud)

InputStream#read:

从输入流中读取一些字节数并将它们存储到缓冲区数组b中.实际读取的字节数以整数形式返回.此方法将阻塞,直到输入数据可用,检测到文件结尾或引发异常.

将在执行的确切时刻读取尽可能多的字节 - 它基本上是缓冲读取.由于这些是原始字节,因此在将它们转换为String时,您必须知道其编码才能正确显示它们(即"UTF-8"部分).如果客户端发送字节的编码是其他编码,则可能需要更改它以便在控制台输出中获取正确的文本.

我建议阅读官方教程: