【发布时间】:2019-12-24 15:51:33
【问题描述】:
我正在尝试在 java 中的套接字上做一个练习并让客户端与服务器通信,我不明白为什么服务器会卡在读取上,就好像它没有收到来自客户端,而实际上是客户端发送它们。 客户端被服务器正确查看,接受成功。怎么办?
服务器代码
ServerSocket server = null;
Socket client = null;
while(true) {
try{
server = new ServerSocket();
server.bind(new InetSocketAddress("localhost", 2000));
client = server.accept();
break;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
BufferedReader reader = null;
BufferedWriter writer = null;
try {
reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
String message = null;
while((message = reader.readLine()) != null) {
System.out.println("Client send: " + message);
String answer = "ok";
writer.write(answer);
writer.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
writer.close();
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
客户端代码
Socket socket = new Socket();
try {
SocketAddress address = new InetSocketAddress("127.0.0.1",2000);
socket.connect(address);
} catch (IOException e) {
e.printStackTrace();
}
BufferedReader reader = null;
BufferedWriter writer = null;
try {
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
String string = "hello";
writer.write(string);
writer.flush();
System.out.print("sent");
String message;
while((message = reader.readLine()) != null) {
System.out.println("Server send: " + message);
break;
}
}catch (SocketException e) {
// TODO: handle exception
System.out.println(e);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
writer.close();
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
【问题讨论】:
-
这个循环:
while(true) { Socket client = null; try{ client = server.accept(); } catch (Exception e) { e.printStackTrace(); } }应该何时退出? -
那么如何应该退出?
-
你看起来需要休息一下,大概是
client = server.accept(); break;。更好的是,创建一个 ClientHandler 接受新创建的服务器套接字并在每个客户端的新线程中运行它。 -
另外,这个
"localhot"看起来很有问题。请告诉我,这在您的实际代码中不存在。 -
没有导入,没有类声明,没有 main 方法,......再次,如果 MRE 链接中的任何内容令人困惑,请询问,我很乐意解释,但请再次阅读链接。
标签: java sockets client-server