从服务器套接字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);
看看你是否得到任何输出。