Java 创建一个新的 ObjectInputStream 块 [英] Java Creating a new ObjectInputStream Blocks

查看:26
本文介绍了Java 创建一个新的 ObjectInputStream 块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用从套接字检索的 InputStream 创建一个新的 ObjectInputStream.这是我的代码:

I'm trying to create a new ObjectInputStream using an InputStream retrieved from a Socket. Here is my code:

这是我的 MessageGetterSender 类的构造函数.程序未到达检查点 4.

This is the constructor for my MessageGetterSender class. The program does not get to Checkpoint 4.

public MessageGetterSender(Socket socket) {

    System.out.println("MessageGetterSender: Checkpoint 1");

    this.socket = socket;

    // Get input and output streams
    try {
        System.out.println("MessageGetterSender: Checkpoint 2");

        InputStream is = socket.getInputStream();

        System.out.println("MessageGetterSender: Checkpoint 3");

        this.in = new ObjectInputStream(is);

        System.out.println("MessageGetterSender: Checkpoint 4");

    } catch (IOException ioe) {
        System.out.println("Could not get ObjectInputStream on socket: " + socket.getLocalPort());
    }

    try {
        this.out = new ObjectOutputStream(socket.getOutputStream());
    } catch (IOException ioe) {
        System.out.println("Could not get ObjectOutputStream on socket: " + socket.getLocalPort());
    }

    System.out.println("MessageGetterSender: Checkpoint 5");
}

我正在从一个类中实例化一个新的 MessageGetterSender 对象,在该类中我连接到服务器以获取套接字.这是相关的代码.它是 InstantMessageClass 的构造函数,该类实例化 MessageGetterSender 对象:

I'm instantiating a new MessageGetterSender object from a class in which I connect to a server to get the socket. Here is the relevant code. It is the constructor for the InstantMessageClass, the class that instantiates the MessageGetterSender object:

public InstantMessageClient(String username) {

try {
    socket = new Socket("localhost", 5555);
} catch (IOException ioe) {
    System.out.println("Error: Could not connect to socket on port: " + serverPort);
}

messageGetterSender = new MessageGetterSender(socket);

...

由于代码没有执行到检查点 4 但它确实到达了检查点 3,我很确定 ObjectInputStream 的实例化是罪魁祸首.我不明白为什么.有任何想法吗?感谢您的帮助.

Since the code does not execute to Checkpoint 4 but it does get to Checkpoint 3, I'm pretty sure the instantiation of the ObjectInputStream is the culprit. I cannot figure out why though. Any ideas? Thanks for the help.

推荐答案

当你构造一个 ObjectInputStream 时,类会在构造器中尝试读取一个与 ObjectOutputStream 在连接的另一端已写入.在读取该标头之前它不会返回.因此,如果您看到构造函数挂起",那是因为套接字的另一端没有使用 ObjectOutputStream,或者尚未刷新数据.

When you construct an ObjectInputStream, in the constructor the class attempts to read a header that the associated ObjectOutputStream on the other end of the connection has written. It will not return until that header has been read. So if you are seeing the constructor 'hang', it's because the other side of the socket either hasn't used an ObjectOutputStream, or hasn't flushed the data yet.

这篇关于Java 创建一个新的 ObjectInputStream 块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆