缓冲读卡器没有从套接字接收数据

我正在编写一个客户端应用程序,它将通过tcp / ip接收连续的数据流。 我遇到的问题是缓冲的读取器对象没有接收到任何数据并且挂在readline方法上。

服务器的工作方式是连接到它,然后发送身份validation信息以接收数据。 我的代码的要点如下

socket = new Socket(strHost, port); authenticate(); inStream = new BufferedReader(new InputStreamReader(socket.getInputStream())); process(inStream); authenticate() { PrintWriter pwriter = new PrintWriter(socket.getOutputStream(), true); pwriter.println(authString); } process(BufferedReader bufferedReader) { while((line = bufferedReader.readLine()) != null) dostuff } 

我创建了一个示例服务器应用程序,它以一种方式发送数据(我认为)服务器正在发送数据并且它连接,并接收和处理数据。 我可以在我的应用程序中正常连接到服务器。 我也可以telnet到服务器并写入身份validation字符串并使用telnet接收大量数据。 但是,我的应用程序只是挂在readLine与服务器,我不明白为什么。

进入的数据(通过telnet atleast)看起来像是以下的连续流:

  data;data;data;data;data data;data;data;data;data 

为什么我的应用程序挂在readline上,我是不是正确输出了身份validation行? 我没有收到任何错误……

编辑我的示例服务器代码(正常工作)…再次这只是模仿我认为真实服务器正在运行的方式,但我可以连接到我的应用程序中只是没有从真实服务器接收数据。

  public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(1987); } catch (IOException e) { System.out.println("Couldn't listen on port: 1987"); System.exit(-1); } Socket clientSocket = null; try { clientSocket = serverSocket.accept(); } catch (IOException e) { System.out.println("Accept failed: 1987"); System.exit(-1); } PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String something; while ((something = in.readLine()) != null) { while(true) { out.println(message); } } out.close(); in.close(); clientSocket.close(); serverSocket.close(); } 

首先,你应该在调用readLine() BufferedReader.ready()之前调用BufferedReader.ready() ,因为ready()会告诉你是否可以读取。

PrintWriter不会抛出I / Oexception,因此在您不知情的情况下写入可能会失败,这就是无法读取的原因。 使用PrintWriter.checkError()查看写入期间是否出现任何错误。

在向管道写入任何内容之前,您应该同时在Socket上设置输入和输出流。 如果您的读者在另一端尝试写入时没有准备好,您将在服务器中获得一个损坏的管道,它将不再发送任何数据。 在您编写或读取任何内容之前,Telnet会设置读写。

您可以使用Wireshark来判断服务器是否实际上正在发送数据。

BufferdReader.readLine()读取行,即以\r\r\n结尾的字符序列。 我想你的服务器将其输出写入一行。 您的telnet输出certificate了这一假设。 只需在服务器端使用PrintWriter.println()

这与我一起使用没有齐平的sockets

 void start_listen() { String result1=""; char[] incoming = new char[1024]; while (!s.isClosed()) { try { int lenght = input.read(incoming); result1 = String.copyValueOf(incoming,0,lenght); } catch (IOException e) { e.printStackTrace(); } Log.d("ddddddddddd",result1); }