为什么客户端无法通过套接字将第二轮msg发送到服务器?

时间:2017-09-05 00:58:46

标签: java socket.io

第一个是我的客户端,第二个是服务器端。为什么客户端无法通过套接字将第二轮msg发送到服务器?当你在控制台中放置一些东西时,服务器将通过套接字响应,然后将msg发送回客户端。但是当我第二次在控制台中输入内容时,msg无法再发送到服务器,请告诉我为什么。谢谢

package client;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Client {
static Socket sock ;
static InputStreamReader IR;
public static void main(String[] args) throws IOException, 
InterruptedException 
{
Client client = new Client();
sock = new Socket("localhost", 1112);
IR = new InputStreamReader(sock.getInputStream());
client.run();
}

public void run() throws IOException, InterruptedException
{
    while(true)
    {

    PrintStream PS = new PrintStream(sock.getOutputStream());



    Scanner sc = new Scanner(System.in); 
    System.out.println("Enter your age:"); 
    int age = sc.nextInt(); 
    PS.println(age);
    if(age == 0)
  {
    break;
  }
    System.out.println("here");

    BufferedReader BR = new BufferedReader(IR);

    String MSG = BR.readLine();
    System.out.println("client: server has received "+MSG);
    Thread.sleep(1000);

    }
    sock.close();
}



}




package server;
import java.io.*;
import java.net.*;
public class Server {
static ServerSocket serverSocket;
public static void main(String[] args) throws IOException, 
InterruptedException {
    Server server = new Server();
    serverSocket = new ServerSocket(1112);
    server.run();


}

public void run() throws IOException, InterruptedException
{
       while(true)
      {
           //ServerSocket serverSocket = new ServerSocket(1112);
           Socket socket = serverSocket.accept();
           InputStreamReader IR = new 
    InputStreamReader(socket.getInputStream());
           BufferedReader BR = new BufferedReader(IR);

           String msg = BR.readLine();
           System.out.println("server: I have received "+msg);
           Thread.sleep(2000);
           if(msg != null)
           {
               PrintStream PS = new 
PrintStream(socket.getOutputStream());
               PS.println(msg);
           }else
           {
               break;
           }

    }
       serverSocket.close();
}



}

1 个答案:

答案 0 :(得分:0)

因此,当客户端套接字尝试连接到服务器套接字时,它会被放在服务器端的队列中。然后,服务器套接字上的.accept()方法将该请求从队列中取出并且"连接"两个插座。

所以,在你的代码中,

  1. 客户端请求连接,
  2. 服务器接受它,
  3. 客户端将年龄发送到服务器,
  4. 服务器读取并发送回来,
  5. 客户端将另一个年龄发送到服务器
  6. 服务器永远不会做任何事情
  7. 问题出现在服务器端的第4步之后。它再次调用.accept()方法,但是没有客户端请求连接,因此.accept()只是等待它获得一个请求连接的套接字(它被称为阻塞方法)。

    您可以通过将Socket socket = serverSocket.accept()移出服务器上的while(true)循环来解决此问题