首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我使用"readAllBytes“方法的简单java客户机/服务器示例程序挂起了?

为什么我使用"readAllBytes“方法的简单java客户机/服务器示例程序挂起了?
EN

Stack Overflow用户
提问于 2021-04-28 08:57:55
回答 1查看 54关注 0票数 1

我正在学习java套接字编程,并编写了两个非常简单的服务器和客户机类。服务器在端口12345上侦听,从客户端接收消息,然后将消息发送回客户端。客户端发送消息,并接收来自服务器的响应。但是,当我先启动sever类,然后启动client类时,两个进程都挂起了。对我哪里做错了有什么见解吗?谢谢!

我使用的是openjdk 15.0.1

代码语言:javascript
运行
复制
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)

这些类如下所示:

服务器类:

代码语言:javascript
运行
复制
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();
    }
 }

客户端类:

代码语言:javascript
运行
复制
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();
    }
 }
EN

回答 1

Stack Overflow用户

发布于 2021-04-28 12:43:00

问题出在使用"readAllBytes“方法。reallAllBytes()方法是在Java9中引入的,它不能自动关闭InputStream实例。当它可以到达流的末尾时,对此方法的进一步调用可以返回一个空字节数组。问题是套接字inputstream在套接字关闭之前没有流结束令牌。这就是为什么两个程序都没有进展而挂起的原因。更新后的客户端程序如下所示。服务器程序的变化与此类似。

代码语言:javascript
运行
复制
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();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67292415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档