java.io.StreamCorruptedException: 無効なストリーム ヘッダー: 73720015

インシデントコード:

Server : ソケットから Message オブジェクトを受信するたびに、そのオブジェクトを出力します。

while (true){
    
                
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                message=(Message) ois.readObject();
                System.out.println(message);            
}

クライアント: 入力メッセージはサーバーに送信されます。

ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

while (true){
    
                   
                System.out.println("请输入要发送的信息");
                String content = scanner.next();               
                oos.writeObject(new Message(content));//问题:这里由同一个oos进行写入
}

問題の原理:

new ObjectOutputStream() が呼び出されるたびに、writeStreamHeader() メソッドが呼び出され、4 バイトの StreamHeader が書き込まれ、オブジェクト ストリームとしてマークされます。複数のオブジェクトが同じ ObjectOutPutStream によって送信される場合、StreamHeader は 1 つだけ表示されます。これは、プログラムがストリーム内のオブジェクトの数を識別できないことを意味します。

ObjectOutStream コンストラクター:

public ObjectOutputStream(OutputStream out) throws IOException {
    
      
        verifySubclass();  
        bout = new BlockDataOutputStream(out);  
        handles = new HandleTable(10, (float) 3.00);  
        subs = new ReplaceTable(10, (float) 3.00);  
        enableOverride = false;  
        writeStreamHeader();  
        bout.setBlockDataMode(true);  
        if (extendedDebugInfo) {
    
      
            debugInfoStack = new DebugTraceInfoStack();  
        } else {
    
      
            debugInfoStack = null;  
        }  
    }  

解決:

writeObject が書き込まれるたびに、新しい ObjectOutPutStream オブジェクトが作成されます。

クライアント:

 while (true){
    
    
                //发送信息
           System.out.println("请输入要发送的信息");
           String content = scanner.next();
           new ObjectOutputStream(socket.getOutputStream()).writeObject(new Message(content));//每一个对象仅对应一次write操作
          //oos.writeObject();
}

おすすめ

転載: blog.csdn.net/weixin_44866921/article/details/132753885