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