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

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

}

最佳答案

您的实现出现问题

<a href="http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html#readLine()" rel="noreferrer noopener nofollow">BufferedReader#readLine</a> :

Reads a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed.

换句话说,如果您的客户从未发送 \n\r该方法直到 IOException 才会结束由于断开连接而抛出。

解决方案

替换此代码:

BufferedReader reader = new BufferedReader(
                    new InputStreamReader(clientSocket.getInputStream()));
String clientData = "";
clientData = reader.readLine();

与:

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

<a href="http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#read(byte%5B%5D)" rel="noreferrer noopener nofollow">InputStream#read</a> :

Reads some number of bytes from the input stream and stores them into the buffer array b. The number of bytes actually read is returned as an integer. This method blocks until input data is available, end of file is detected, or an exception is thrown.

将在执行时读取尽可能多的字节 - 它基本上是缓冲读取。由于这些是原始字节,当 converting them to String您必须知道其编码才能正确显示它们(即“UTF-8”部分)。如果encoding其中您的客户端发送字节是其他的,您可能需要更改它才能在控制台输出中获得正确的文本。

我建议阅读官方教程:

关于java - 在服务器套接字java中从客户端获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18418326/

相关文章:

java - 在 HDFS 上使用 libhdfs 进行文件 i/o

java - JSON 序列化在 java POJO 中给出 null

ajax - Arduino WebServer和socket.io

python - 当我在控制台中输入命令时,TypeError : a bytes-like object is required, 不是 'str'

java - MMO如何处理真人游戏的每一刻为成千上万的玩家计算和发送数据包?

java - @PostConstruct 与 Spring Batch reader 结合时调用失败

java - 无法使用套接字接收字符串

java - 套接字服务器: should provide shell like interface

java - 使用 localhost android 获取套接字连接超时

java - 当我查询 presto 数据时,mybatis 遇到一些问题