需要有关服务器-客户端套接字通信的一些帮助



我正在尝试在 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();
}

My MRE:

import java.io.*;
import java.net.*;
public class Foo {
public static void main(String[] args) {
new Thread(() -> ServerFun.someServerMethod()).start();
try {
Thread.sleep(200);
} catch (InterruptedException e) {}
new Thread(() -> ClientFun.someClientMethod()).start();
}
}
class ClientFun {
public static void someClientMethod() {
Socket socket = new Socket();
try {
SocketAddress address = new InetSocketAddress("LocalHost", 2000);
System.out.println("client socket address: " + address);
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) {
e.printStackTrace();
}
try {
String string = "hello";
writer.write(string);
writer.newLine();
writer.flush();
System.out.print("sent");
String message;
while ((message = reader.readLine()) != null) {
System.out.println("Server send: " + message);
break;
}
} catch (SocketException e) {
System.out.println(e);
} catch (IOException e) {
e.printStackTrace();
}
try {
writer.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ServerFun {
public static void someServerMethod() {
ServerSocket server = null;
Socket client = null;
// !!while (true) {  // not needed for a single client
try {
server = new ServerSocket();
server.bind(new InetSocketAddress("localhost", 2000));
System.out.println("server socket: " + server.getInetAddress());
client = server.accept();
// !! break;
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
// !! }
BufferedReader reader = null;
BufferedWriter writer = null;
try {
reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
} catch (IOException e) {
e.printStackTrace();
}
try {
String message = null;
while ((message = reader.readLine()) != null) {
System.out.println("Client send: " + message);
String answer = "ok";
writer.write(answer);
writer.newLine();
writer.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
writer.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

您需要发送一个新行才能使readLine方法正常工作。 例如,

writer.write(answer);
writer.newLine();  // add this **********
writer.flush();

这需要为客户端和服务器到位。或者,使用PrintWriter并out.println(answer);

我还必须使用"本地主机"才能让客户端工作。

希望您能看到MRE在我们解决这个问题中的效用。下次,我希望你能为我们创建一个,而不是强迫我们创建一个。

最新更新