我正在尝试自己实现客户端 - 服务器应用程序。它的工作到目前为止,除了事实,当我通过另一个应用程序(例如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();
}
}
}
答案 0 :(得分:1)
您正在致电DataInputStream.readUTF8
。这需要这样的数据:
首先,读取两个字节并用于构造无符号的16位整数,其方式与readUnsignedShort方法完全相同。此整数值称为UTF长度,并指定要读取的其他字节数。然后通过将它们分组考虑将这些字节转换为字符。每个组的长度是从组的第一个字节的值计算的。组后面的字节(如果有)是下一组的第一个字节。
(等)
换句话说,这不仅仅是UTF-8。它是UTF-8 的一个细微变化,带有长度前缀。这不是浏览器要写入连接的内容。基本上,DataInput
和DataOutput
是对称的,但并非完全是通用的 - 它们通常一起使用,一方通过DataInput
读取另一方用{{{{{{ 1}}。
如果您只想阅读UTF-8行,可以使用:
DataOutput
(现在一点也不清楚你应该期望浏览器将UTF-8写入套接字,但上面更有可能让你进入下一步,我说...)