新的ObjectInputStream()块

问题描述 投票:8回答:2
public class SerProg {


    static ServerSocket ser=null;
    static Socket cli=null;
    static ObjectInputStream ins=null;
    static ObjectOutputStream outs=null;


    public static void main(String[] args) {

        try {

            ser=new ServerSocket(9000,10);
            cli=ser.accept();

            System.out.println("Connected to :"+cli.getInetAddress().getHostAddress()+" At Port :"+cli.getLocalPort());

            ins=new ObjectInputStream(cli.getInputStream());
            outs=new ObjectOutputStream(cli.getOutputStream());

            String str=(String)ins.readObject();


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

}

和客户

public class SerProg {

    /**
     * @param args
     */
    static ServerSocket ser=null;
    static Socket cli=null;
    static ObjectInputStream ins=null;
    static ObjectOutputStream outs=null;


    public static void main(String[] args) {
        // TODO Auto-generated method stub

        try {

            ser=new ServerSocket(9000,10);
            cli=ser.accept();

            System.out.println("Connected to :"+cli.getInetAddress().getHostAddress()+" At Port :"+cli.getLocalPort());

            ins=new ObjectInputStream(cli.getInputStream());
            outs=new ObjectOutputStream(cli.getOutputStream());

            String str=(String)ins.readObject();


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

}

连接已成功建立,但在服务器代码行中

ins=new ObjectInputStream(cli.getInputStream());

代码停止并且不继续,可能是什么问题?

java sockets objectinputstream
2个回答
32
投票

您需要在连接两侧的ObjectOutputStream之前创建ObjectInputStream。创建ObjectInputStream时,它将尝试从InputStream中读取对象流标头。因此,如果尚未创建另一侧的ObjectOutputStream,则没有要读取的对象流标头,并且它将无限期地阻塞。

或用不同的措词:如果双方首先构造了ObjectInputStream,则双方都将阻止尝试读取对象流标头,直到创建ObjectOutputStream之前,该对象流标头才被写入(在该行的另一侧) ;这将永远不会发生,因为双方都在ObjectInputStream的构造函数中被阻止。

这可以从ObjectInputStream(InputStream in)的Javadoc推断出来:

从流中读取并验证序列化流头。该构造函数将阻塞,直到相应的ObjectOutputStream写入并刷新了标题为止。

这在Esmond Pitt的Java基础网络的3.6.2节中也有介绍。


0
投票

您必须为流进行握手。我的意思是,在客户端,创建对象输入流时,必须在服务器端创建对象输出流。

ObjectInputStream(InputStream in)

我试图说明如何为流进行握手。

© www.soinside.com 2019 - 2024. All rights reserved.