缓冲的读取器未从套接字接收数据

问题描述

我正在编写一个客户端应用程序,它将通过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远程登录服务器并写入身份验证字符串并接收大量数据。但是我的应用程序只是挂在服务器的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();
}
    

解决方法

        首先,您应先致电
BufferedReader.ready()
,然后再致电
readLine()
,因为
ready()
会告诉您是否可以阅读。
PrintWriter
不会引发I / O异常,因此在您不知情的情况下,写入可能会失败,这就是为什么没有要读取的内容。用ѭ7键查看写入过程中是否出现任何错误。 在将任何内容写入管道之前,应同时在
Socket
上设置输入和输出流。如果您的阅读器在另一端尝试写时还没有准备好,则服务器中的管道将断开,并且该管道将不再发送任何数据。 Telnet会在您写入或读取任何内容之前设置读写权限。 您可以使用Wireshark来判断服务器是否正在实际发送数据。     ,        
BufferdReader.readLine()
读取行,即以
\\r
\\r\\n
结尾的字符序列。我猜您的服务器将其输出写入一行。您的telnet输出证明了这一假设。只需在服务器端使用
PrintWriter.println()
。     ,        和我一起工作 带插座,不带冲洗
void start_listen()
   {
       String    result1=\"\";
       char[] incoming = new char[1024];
       while (!s.isClosed())
       {
           try {

           int lenght  =  input.read(incoming);
               result1 = String.copyValueOf(incoming,lenght);


           }
           catch (IOException e)
           {
               e.printStackTrace();
           }
           Log.d(\"ddddddddddd\",result1);

       }