[英]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.