2017-09-05 20 views
0

第一个是我的客户端,第二个是服务器端。为什么客户端无法通过套接字将其第二轮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(); 
} 



} 
+0

不要创建'PrintStream'和'Scanner'内环路上解决这个问题。 – EJP

回答

0

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

所以,在你的代码,

  1. 客户端请求连接,
  2. 服务器接受它,
  3. 客户端发送年龄服务器,
  4. 服务器读取它,并把它发送回来,
  5. 客户端发送另一个时代到服务器
  6. 服务器从不做任何事

问题发生在服务器端的第4步之后。它再次调用.accept()方法,但没有客户端请求连接,因此.accept()只是等待它获取套接字请求连接(它被称为阻塞方法)。

你可以通过移动Socket socket = serverSocket.accept()while(true)循环的服务器

+0

非常感谢,我是新的插座,谢谢你hahahaha –

+0

@NeilMa呀当然,如果它回答你的问题,请继续并接受它作为答案请 – MrWayFarOut

相关问题