为什么客户端不能通过socket向服务器发送第二轮消息?

uubf1zoe  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(411)

第一个是我的客户端,第二个是服务器端,为什么客户端不能通过socket向服务器发送第二轮消息?当你在控制台里放东西的时候,服务器会通过socket响应,然后把消息发送回客户端。但是当我第二次在控制台里放东西的时候,消息就不能再发送到服务器了,请告诉我为什么。谢谢

  1. package client;
  2. import java.io.*;
  3. import java.net.*;
  4. import java.util.Scanner;
  5. public class Client {
  6. static Socket sock ;
  7. static InputStreamReader IR;
  8. public static void main(String[] args) throws IOException,
  9. InterruptedException
  10. {
  11. Client client = new Client();
  12. sock = new Socket("localhost", 1112);
  13. IR = new InputStreamReader(sock.getInputStream());
  14. client.run();
  15. }
  16. public void run() throws IOException, InterruptedException
  17. {
  18. while(true)
  19. {
  20. PrintStream PS = new PrintStream(sock.getOutputStream());
  21. Scanner sc = new Scanner(System.in);
  22. System.out.println("Enter your age:");
  23. int age = sc.nextInt();
  24. PS.println(age);
  25. if(age == 0)
  26. {
  27. break;
  28. }
  29. System.out.println("here");
  30. BufferedReader BR = new BufferedReader(IR);
  31. String MSG = BR.readLine();
  32. System.out.println("client: server has received "+MSG);
  33. Thread.sleep(1000);
  34. }
  35. sock.close();
  36. }
  37. }
  38. package server;
  39. import java.io.*;
  40. import java.net.*;
  41. public class Server {
  42. static ServerSocket serverSocket;
  43. public static void main(String[] args) throws IOException,
  44. InterruptedException {
  45. Server server = new Server();
  46. serverSocket = new ServerSocket(1112);
  47. server.run();
  48. }
  49. public void run() throws IOException, InterruptedException
  50. {
  51. while(true)
  52. {
  53. //ServerSocket serverSocket = new ServerSocket(1112);
  54. Socket socket = serverSocket.accept();
  55. InputStreamReader IR = new
  56. InputStreamReader(socket.getInputStream());
  57. BufferedReader BR = new BufferedReader(IR);
  58. String msg = BR.readLine();
  59. System.out.println("server: I have received "+msg);
  60. Thread.sleep(2000);
  61. if(msg != null)
  62. {
  63. PrintStream PS = new
  64. PrintStream(socket.getOutputStream());
  65. PS.println(msg);
  66. }else
  67. {
  68. break;
  69. }
  70. }
  71. serverSocket.close();
  72. }
  73. }
ax6ht2ek

ax6ht2ek1#

因此,当客户机套接字尝试连接到服务器套接字时,它会被放到服务器端的队列中。然后 .accept() 方法将请求从队列中移除,并“连接”两个套接字。
所以,在你的代码里,
客户端请求连接,
服务器接受它,
客户端向服务器发送年龄,
服务器读取并发回,
客户端向服务器发送另一个age
服务器从不做任何事情
问题发生在服务器端的步骤4之后。它称之为 .accept() 方法,但没有客户端请求连接,因此 .accept() 只需等待,直到它得到一个请求连接的套接字(称为阻塞方法)。
你可以通过移动 Socket socket = serverSocket.accept() 在外面 while(true) 服务器上的循环

相关问题