11
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());

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

4

2 回答 2

37

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

或者换一种说法:如果双方首先构造,双方都将阻止尝试读取对象流标头,直到创建 (在行的另一侧)ObjectInputStream才会写入;ObjectOutputStream这永远不会发生,因为双方都被ObjectInputStream.

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

从流中读取序列化流标头并进行验证。此构造函数将阻塞,直到相应的 ObjectOutputStream 已写入并刷新标头。

这也在Esmond Pitt的 Java 基础网络的第 3.6.2 节中进行了描述。

于 2013-01-01T13:53:42.187 回答
-1

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

//SERVER SIDE
Socket clientSocket = TcpServer.socket.accept();
// 1. input stream;
ObjectInputStream sInput = new ObjectInputStream(clientSocket.getInputStream());
// 2. output stream
ObjectOutputStream sOutput = new ObjectOutputStream(clientSocket.getOutputStream());


//CLIENT SIDE
Socket socket = new Socket(ip, port);
// 2. output stream
ObjectOutputStream sOutput = new (socket.getOutputStream());
// 1. input stream
ObjectInputStream sInput = new ObjectInputStream(socket.getInputStream());

我试图展示如何为流进行握手。

于 2020-02-23T10:59:06.343 回答