Java Socket等待UTF8

时间:2015-04-27 13:10:46

标签: java sockets

我正在尝试自己实现客户端 - 服务器应用程序。它的工作到目前为止,除了事实,当我通过另一个应用程序(例如Web浏览器)访问端口时,服务器应用程序正在阻塞。

如果连接的应用程序是"客户端应用程序"是否有任何简单的方法/良好做法可以检查?

这是一个监听端口8080的套接字的简短示例。套接字等待2个字符串。如果您现在连接浏览器(localhost:8080),则建立连接,但正在等待第一个UTF8。

public class MainSocket {

public static void main(String[] args) {
    ServerSocket serverSocket;
    try {            
        serverSocket = new ServerSocket(8080);
        while (true) {
            try {
                Socket clientSocket = serverSocket.accept();
                System.out.println("Connection established");
                DataInputStream in = new DataInputStream(clientSocket.getInputStream());
                System.out.println(in.readUTF());
                System.out.println(in.readUTF());
                in.close();
                clientSocket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

1 个答案:

答案 0 :(得分:1)

您正在致电DataInputStream.readUTF8。这需要这样的数据:

  

首先,读取两个字节并用于构造无符号的16位整数,其方式与readUnsignedShort方法完全相同。此整数值称为UTF长度,并指定要读取的其他字节数。然后通过将它们分组考虑将这些字节转换为字符。每个组的长度是从组的第一个字节的值计算的。组后面的字节(如果有)是下一组的第一个字节。

(等)

换句话说,这不仅仅是UTF-8。它是UTF-8 的一个细微变化,带有长度前缀。这不是浏览器要写入连接的内容。基本上,DataInputDataOutput是对称的,但并非完全是通用的 - 它们通常一起使用,一方通过DataInput读取另一方用{{{{{{ 1}}。

如果您只想阅读UTF-8行,可以使用:

DataOutput

(现在一点也不清楚你应该期望浏览器将UTF-8写入套接字,但上面更有可能让你进入下一步,我说...)