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

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

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

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

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

代码: –

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

您的实施有问题

BufferedReader#readLine

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

换句话说,如果您的客户端没有发送\n\r \n字符,则该方法将不会结束,直到因断开连接而抛出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()); 

InputStream#read

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

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

我建议阅读官方教程:

  • 字节流
  • 字符流
  • 缓冲流

BufferedReader.readLine()仅在存在行尾或流结束时返回。 确保客户端正在发送换行符,或使用不同的方式读取输入流,如:

 int ch = 0; while ((ch = instream.read()) >= 0) { // do sometyhing with the character off the input stream. System.out.println("Got byte " + ch); } // will get here when the input stream is closed. 

你的ExecutorService(不是?)被调用可能是一个问题。

试着抹去

 clientProcessingPool.submit(new ClientTask(clientSocket)); 

 BufferedReader reader = new BufferedReader( new InputStreamReader(clientSocket.getInputStream())); String line; while( (line = reader.readLine()) != null) // just read everything System.out.println(line); 

看看你是否得到任何输出。