这应该是一个5分钟的测试,只是为了看它是否按照建议工作。我想创建一个简单的HTTP“服务器”,除了打印出来的内容(即HTTP请求)之外什么都不做。
public static void main(String args[]) throws IOException {
ServerSocket server = new ServerSocket(port);
try (Socket socket = server.accept()) {
DataInputStream input = new DataInputStream(socket.getInputStream());
String received = input.readUTF();
System.out.println("Received: \n" + received);
}
}
但是我提出了以下问题:当我启动他的程序然后在Firefox中尝试http://localhost/时,流被卡在readUTF()方法中。它根本不会回来。
我尝试使用套接字通道和缓冲区大小为128.在第三次读取后它会卡住(因此在第384和第511字节之间的任何位置)。这是以下代码:
public static void main(String args[]) throws IOException {
CharsetDecoder decoder = Charset.forName("UTF8").newDecoder();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(port));
ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
buffer.clear();
SocketChannel socketChannel = serverSocketChannel.accept();
StringBuilder received = new StringBuilder();
while (socketChannel.read(buffer) > 0) {
buffer.position(0);
received.append(decoder.decode(buffer).toString());
buffer.clear();
}
System.out.println("Received: \n" + received.toString());
}
它们都显示与read方法不终止相同的行为。你有什么想法,如何解决这个问题,尤其是这种行为的原因是什么?
答案 0 :(得分:0)
DataInputStream
用于读取二进制数据。在这种特殊情况下,它意味着readUTF()
方法首先将字符串长度读取为两个字节,然后读取与接收长度一样多的字节。
此流无法满足您的需求,只需从getInputStream()
读取或用BufferedReader
打包即可。