[英]Reading from a socket not waiting for input?
我正在嘗試使用Java進行一些Socket編程,並且正在使用BufferedStreamReader.read(char [])方法。
Java doc指出:
將字符讀入數組。 該方法將阻塞,直到某些輸入可用,發生I / O錯誤或到達流的末尾為止。
只是它不會阻止輸入。
somone可以指出以下代碼的問題嗎? 即使將行寫入輸出流,打印“ RCVD:”的行仍在打印,但在RCVD之后沒有任何數據。
public class Main {
/**
* @param args the command line arguments
*/
private static Socket tcpSocket;
public static void main(String args[]) {
try {
tcpSocket = new Socket("localhost", 8080);
} catch (UnknownHostException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
new Thread(new Runnable() {
public void run() {
try {
System.out.println("Starting listening");
char[] dataBytes = new char[9];
BufferedReader netStream = new BufferedReader(new InputStreamReader(tcpSocket.getInputStream()));
while (true) {
netStream.read(dataBytes);
System.out.println("RCVD: " + String.copyValueOf(dataBytes));
}
} catch (UnknownHostException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}).start();
new Thread(new Runnable(){
public void run() {
System.out.println("Starting Writer");
PrintWriter out = null;
try {
out = new PrintWriter(tcpSocket.getOutputStream(), true);
for (int i = 0 ; i < 10 ; i++)
{
// out.println("000000000");
}
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}).start();
}
}
附加信息
我嘗試更改端口號,應用程序崩潰,也許我正在連接到計算機上運行的其他設備。
另外,從它的外觀來看,我正在接收穩定的字節流,所有字節都為空格。
您需要研究ServerSocket 。 目前,您的Socket尚未真正在“監聽”,它正在嘗試連接到localhost:8080,但實際上並未監聽它!
實際上,您正在連接到本地計算機上的其他設備。
查看上面的代碼,好像您希望在套接字的輸入流中接收寫入其輸出緩沖區的數據。 好像您將插座視為一段管子一樣,輸入流在管子的一端,輸出流在另一端。
套接字實際上是在管的一端 ,以使您聽到的歸結,並允許你“談”入管輸出流的輸入流。
對於讓您感到困惑的事情,我可能感到困惑...上述幫助嗎?
如果您認為讀取沒有阻塞,請捕獲read方法的結果並打印出來。 如果您的假設正確,則應為零。
int n = netStream.read(dataBytes);
System.out.println("Read " + n + " characters.");
無論如何,您都需要知道讀取了多少個字符,以便可以正確調用copyValueOf
-通常,數組的僅一部分將被最后一次讀取的數據填充。 而且,當然,返回值表示流結束(感謝Darron!),因此您必須進行檢查。
我已經運行了您的代碼,並且能夠從服務器接收和打印數據。 測試您的服務器端,以確保其正常運行。
只需2c。 我不是套接字專業人士,但是當我使用它時,我傾向於在下一行中閱讀更多內容。
char[] dataBytes = new char[9];//tcpSocket.getReceiveBufferSize()
int result = 0;
while((result = is.read(inputData)) != -1)//check for eof,
//if(result > 0){//<- most probably the case anyways considering .read returned
//display only what was received
System.out.println("RCVD: " + String.copyValueOf(inputData,0,result));
//}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.