我正在学习java套接字编程,并编写了两个非常简单的服务器和客户机类。服务器在端口12345上侦听,从客户端接收消息,然后将消息发送回客户端。客户端发送消息,并接收来自服务器的响应。但是,当我先启动sever类,然后启动client类时,两个进程都挂起了。对我哪里做错了有什么见解吗?谢谢!
我使用的是openjdk 15.0.1
java -version
openjdk version "15.0.1" 2020-10-20
OpenJDK Runtime Environment (build 15.0.1+9)
OpenJDK 64-Bit Server VM (build 15.0.1+9, mixed mode, sharing)
这些类如下所示:
服务器类:
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SimpleServer {
private static final int SERVER_PORT = 12345;
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
Socket socket = serverSocket.accept();
InputStream in = socket.getInputStream();
String input = new String(in.readAllBytes());
OutputStream os = socket.getOutputStream();
os.write(input.getBytes());
os.flush();
os.close();
}
}
客户端类:
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class SimpleClient {
public static final int SERVER_PORT = 12345;
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", SERVER_PORT);
PrintWriter writer = new PrintWriter(socket.getOutputStream());
writer.println("GET /resources HTTP/1.1");
writer.flush();
InputStream is = socket.getInputStream();
String result = new String(is.readAllBytes());
System.out.println("response : " + result);
writer.close();
is.close();
socket.close();
}
}
发布于 2021-04-28 12:43:00
问题出在使用"readAllBytes“方法。reallAllBytes()方法是在Java9中引入的,它不能自动关闭InputStream实例。当它可以到达流的末尾时,对此方法的进一步调用可以返回一个空字节数组。问题是套接字inputstream在套接字关闭之前没有流结束令牌。这就是为什么两个程序都没有进展而挂起的原因。更新后的客户端程序如下所示。服务器程序的变化与此类似。
public class SimpleClient {
public static final int SERVER_PORT = 12345;
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", SERVER_PORT);
PrintWriter writer = new PrintWriter(socket.getOutputStream());
writer.println("GET /resources HTTP/1.1");
writer.flush();
InputStream is = socket.getInputStream();
byte[] buffer = new byte[1024];
is.read(buffer);
String result = new String(buffer);
System.out.println("response : " + result);
writer.close();
is.close();
socket.close();
}
}
https://stackoverflow.com/questions/67292415
复制相似问题