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

时间:2011-06-15 15:05:15

标签: java sockets inputstream bufferedreader

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

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

之下
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到服务器并写入身份验证字符串并使用telnet接收大量数据。但是我的应用程序只是挂在readLine与服务器,我不明白为什么。

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

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

为什么我的应用程序挂在readline上,我没有正确输出身份验证行?我没有收到任何错误......

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

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

3 个答案:

答案 0 :(得分:11)

首先,您应在致电BufferedReader.ready()之前致电readLine(),因为ready()会告诉您是否可以阅读。

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

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

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

答案 1 :(得分:9)

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

答案 2 :(得分:-1)

这项工作与我同在 没有刷新的插座

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

       }