-1

当我学习 Java 中的网络和 io 时,我正在慢慢地构建客户端/服务器应用程序以应用我在不同教程中阅读的内容。不过我很困惑,我一直在试图弄清楚为什么我的代码很长一段时间都不起作用。所以我决定求助于 SO 的无限智慧 :)

在接受来自 localhost 的客户端套接字连接后,我的服务器上有这个:

BufferedInputStream in = new BufferedInputStream(socket.getInputStream(),Config.BUFFER_SIZE_NET);
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream(),Config.BUFFER_SIZE_NET);
String msg = "";
byte buffer[] = new byte[Config.BUFFER_SIZE_READ];
int bytesRead;
System.out.println("Server is waiting for data");
while ((bytesRead = in.read(buffer)) > 0) {
    msg = msg + new String(buffer,Config.CHARSET);
}
System.out.println("Server received: "+msg);

连接到服务器后,在我按下 JButton 后在客户端执行此操作:

BufferedInputStream in = new BufferedInputStream(socket.getInputStream(),Config.BUFFER_SIZE_NET);
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream(),Config.BUFFER_SIZE_NET);
String msg = "msg";
try{
    out.write(msg.getBytes(Config.CHARSET));
    out.flush();
    System.out.println("Client sent: "+msg);
}catch(Throwable e){e.printStackTrace();}

按下客户端上的按钮后,我得到以下输出:

Client sent: msg

在服务器端,我得到:

Server is waiting for data

如果我调试服务器,我会在以下行看到它永远被阻塞:

while ((bytesRead = in.read(buffer)) > 0) {

不抛出异常。我在这里想念什么?我以前让它工作,但我做了很多改变,现在我无法让它恢复工作。

注意:这是实际代码的略微修改版本,以便于查看。如果您认为缺少相关内容,请告诉我!

4

1 回答 1

0

我从我自己挖的坑里爬了出来。事实证明,我没有检查接收到的数据是否结束,因此代码要么阻塞读取,要么处于随后的循环中。通过检查服务器读取的数据中的特定字节序列,在 while 循环内,我能够识别数据的结尾并从循环中中断。

我不知道这是否是上述问题的(最)正确答案,但我以这种方式解决了它,所以我将其作为答案提交。

于 2012-12-23T20:21:39.090 回答