Java套接字:Read不返回

时间:2015-12-18 11:13:15

标签: java sockets server

这应该是一个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方法不终止相同的行为。你有什么想法,如何解决这个问题,尤其是这种行为的原因是什么?

1 个答案:

答案 0 :(得分:0)

DataInputStream用于读取二进制数据。在这种特殊情况下,它意味着readUTF()方法首先将字符串长度读取为两个字节,然后读取与接收长度一样多的字节。

此流无法满足您的需求,只需从getInputStream()读取或用BufferedReader打包即可。