簡體   English   中英

緩沖的讀取器未從套接字接收數據

[英]buffered reader not receiving data from socket

我正在編寫一個客戶端應用程序,它將通過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();
}

首先,您應該在調用readLine() BufferedReader.ready()之前調用BufferedReader.ready() ,因為ready()會告訴您是否可以讀取。

PrintWriter不會引發I / O異常,因此在您不知情的情況下寫入可能會失敗,這就是為什么沒有要讀取的內容。 使用PrintWriter.checkError()查看在寫入過程中是否出現任何錯誤。

在將任何內容寫到管道之前,您應該同時在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,0,lenght);


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

       }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM