【发布时间】:2019-06-05 04:15:41
【问题描述】:
我刚开始接触套接字编程,所以为了加深对它的理解,我想构建一个多客户端聊天应用程序。
我打算这样做的方式如下: 应用程序启动后,您有两个选择:创建服务器或加入服务器。
如果您选择创建服务器,则将启动一个新线程并托管该服务器,然后将启动另一个线程,该线程将创建一个新客户端并自动连接到刚刚构建的服务器。
在这里我遇到了以下问题。 每个客户端都可以向服务器发送消息,但为了使所有客户端的消息保持同步,我正在考虑将检索到的消息从服务器重定向到所有客户端,如下图所示。
问题是,当我尝试在客户端和服务器上侦听和发送时,我得到了这个错误。
java.net.SocketException: Connection reset
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:186)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:140)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:200)
at java.base/java.io.DataInputStream.readUnsignedShort(DataInputStream.java:342)
at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:594)
at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:569)
at parctice.Server.lambda$main$0(Server.java:32)
at java.base/java.lang.Thread.run(Thread.java:835)
这是我的服务器:
int port = 4444;
try {
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("server starts port = " + serverSocket.getLocalSocketAddress());
while(true){
Socket socket = serverSocket.accept();
System.out.println("accepts : " + socket.getRemoteSocketAddress());
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
String[] message = {""};
new Thread(() -> {
try {
while(in.available() > 0){
System.out.println("SERVER > " + in.readUTF());
message[0] = in.readUTF();
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
System.err.println(message[0]);
try {
out.writeUTF(message[0] + "REDIRECTED MESSAGE");
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
和我的客户:
int portNumber = 4444;
System.out.println("CLIENT > Trying to connect to the server...");
try {
Socket socket = new Socket("localhost", portNumber);
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
new Thread(() -> {
try {
while(in.available() > 0){
System.out.println("SERVER > " + in.readUTF());
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
try {
out.writeUTF("test");
} catch (IOException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
最后我想问一下你们是否认为我尝试使用的逻辑是正确的,如果不是,请告诉我哪里出了问题,如果可能的话,你能解释一下为什么我不是能够在客户端和服务器上同时收听和发送?因为当我尝试通过客户端发送数据并在服务器上检索它时它工作得很好,但我想完成双向通信。
【问题讨论】:
-
你能举一个完整输出的例子吗?
-
System.out.println("SERVER > " + in.readUTF()); message[0] = in.readUTF();实际上尝试从套接字读取 两个 UTF 字符串。除了抛出异常之外,您也无法检测客户端何时关闭连接。客户端在编写“测试”后几乎立即关闭连接。在大多数情况下,使用.available()是错误的。
标签: java sockets client-server chat serversocket