第一个是我的客户端,第二个是服务器端。为什么客户端无法通过套接字将第二轮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 :(得分:0)
因此,当客户端套接字尝试连接到服务器套接字时,它会被放在服务器端的队列中。然后,服务器套接字上的.accept()
方法将该请求从队列中取出并且"连接"两个插座。
所以,在你的代码中,
问题出现在服务器端的第4步之后。它再次调用.accept()
方法,但是没有客户端请求连接,因此.accept()
只是等待它获得一个请求连接的套接字(它被称为阻塞方法)。
您可以通过将Socket socket = serverSocket.accept()
移出服务器上的while(true)
循环来解决此问题