Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 新的ObjectInputStream()块_Java_Sockets_Objectinputstream - Fatal编程技术网

Java 新的ObjectInputStream()块

Java 新的ObjectInputStream()块,java,sockets,objectinputstream,Java,Sockets,Objectinputstream,客户呢 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=

客户呢

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


    }

}

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

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

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

这可以从以下的Javadoc中推断:

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


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

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

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

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

我不明白为什么ObjectOutputStream和ObjectInputStream@benjarobin如果双方都首先构造
ObjectInputStream
,则双方都将阻止尝试读取对象流标头,在创建
ObjectOutputStream
之前(在该行的另一侧)不会写入它;这将永远不会发生,因为双方都被阻塞在
ObjectInputStream
的构造函数中。对不起,我误解了您的消息,对不起!!!你的评论很清楚,你应该在回答中加上它。我不知道客户端和服务器都在双向发送对象(我的错)您从我这里获得+1:-)我看到了许多重复的问题,它们都有相同的答案,不幸的是,这个解决方案不适合我,您还有其他建议吗?@danibilel在某些实现中,可能需要在创建
ObjectOutputStream
后立即显式调用
flush()
,然后再创建
ObjectInputStream
。但是,在任何情况下,都必须在两端先构造出,然后再构造入,以防止相互等待。您已经完成了两次SerProg代码。不必是首先创建
ObjectOutputStream
的客户端:它可以是任一端,但首先在两端创建它是最安全的。那你就不会有问题了。
//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());