Java 为什么我的服务器没有从客户端接收数据?

Java 为什么我的服务器没有从客户端接收数据?,java,sockets,java-io,Java,Sockets,Java Io,在我学习Java中的网络和io时,我正在慢慢构建客户机/服务器应用程序,以将我所阅读的内容应用到不同的教程中。但是我很困惑,我一直在试图弄明白为什么我的代码很长时间都不工作。所以我决定求助于苏的无限智慧:) 从localhost接受客户端套接字连接后,我的服务器上有: BufferedInputStream in = new BufferedInputStream(socket.getInputStream(),Config.BUFFER_SIZE_NET); BufferedOutputStr

在我学习Java中的网络和io时,我正在慢慢构建客户机/服务器应用程序,以将我所阅读的内容应用到不同的教程中。但是我很困惑,我一直在试图弄明白为什么我的代码很长时间都不工作。所以我决定求助于苏的无限智慧:)

从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) {
没有抛出异常。我错过了什么?我以前让它工作,但我做了很多改变,现在我不能让它恢复工作


注意:这是对实际代码的一个稍微修改的版本,以便于查看。如果你认为有什么相关的遗漏,让我知道

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


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

您发布的代码片段没有任何问题(除了使用了可怕的字符串连接)。您为什么要自己缓冲它?使用[
BufferedWriter
](docs.oracle.com/javase/6/docs/api/java/io/BufferedWriter.html)而不是。布赖恩:你是说在while循环中?出于好奇,为什么这很可怕?我应该怎么做呢?还有,关于什么可能导致服务器无法从客户端读取数据的猜测吗?卢卡斯:谢谢你的建议。我会这么做,但我认为这不是问题的根源,对吗?@BrianRoach是的,有。在从缓冲区构造字符串时,他没有使用读取的长度,而是假设缓冲区已满。