Was*_*eem 3 java sockets serializable
来自服务器代码的片段:
 public void run() {
        try {
          // Create data input and output streams
          ObjectInputStream inputFromClient = new ObjectInputStream(
            socket.getInputStream());
          ObjectOutputStream outputToClient = new ObjectOutputStream(
            socket.getOutputStream());
          while (true) {
         cop = inputFromClient.readObject();
         String[][] m1=new String[][] {{"1", "1","1"}};
         Object xx=new getSerialModel(m1);
         outputToClient.reset();
         outputToClient.writeObject(xx);
         outputToClient.flush();
          }
        }
Run Code Online (Sandbox Code Playgroud)
来自客户的片段:
//////////////
    /// sockt jop
    try {
    // Create a socket to connect to the server
   socket = new Socket("127.0.0."+Math.round(50+Math.random()*50), 8000);
    // Create an output stream to send data to the server
   toServer = new ObjectOutputStream(socket.getOutputStream());
   toServer.flush();
  }
  catch (IOException ex) {
    msgArea.append('\n' + ex.toString() + '\n');
  }
///////////////////
//***
///////////////////
buttonSave.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent ev)
{
System.out.println("Saving data is not implemented yet.");
        String[][] m1={{"0","0","0"}};
        for ( int i = 0 ; i < tableModel.getRowCount() ; i++ ){
            { for ( int j = 0 ; j < tableModel.getColumnCount() ; j++ )
                    m1[i][j]=(String)tableModel.getValueAt(i, j) ;
            }
        }
        getSerialModel obt =new getSerialModel(m1);
        try{
            toServer.reset();
        toServer.writeObject(obt);
       toServer.flush();
        }
        catch (Exception ex) {
     msgArea.append("cant reach the server its may be off" + '\n');
   }
}
});
// button send msg
    buttonsendtest.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent ev)
{
        try{
       fromServer = new ObjectInputStream(socket.getInputStream());
       Object mdata = fromServer.readObject();
       tableModel.setDataVector((((getSerialModel)mdata).getmodel()), columnNames);
       table.updateUI();
        }
        catch (Exception ex) {
            System.out.print(ex.getStackTrace());
     msgArea.append("cant reach the server its may be off "+ ex.toString() + '\n');
   }
}
});
Run Code Online (Sandbox Code Playgroud)
当我尝试多次从服务器读取可序列化对象时,我得到了这个异常,第一次接收器成功读取它.
java.io.StreamCorruptedException: invalid stream header: 00007571
Run Code Online (Sandbox Code Playgroud)
我该怎么解决?
如果要为同一个套接字输入流串联创建多个ObjectInputStream实例,这似乎是一个坏主意.如果服务器正在将多个对象写入同一输出流,则存在与每个唯一对象仅发送一次的序列化相关信息,并且只有客户端上的第一个ObjectInputStream实例才能可靠地读取此信息.每个套接字输入流只使用一个ObjectInputStream实例,每个套接字输出流只使用一个ObjectOutputStream实例可能是最安全的实现.
此外,如果要将多个对象写入服务器端的同一个 ObjectOutputStream实例(即多个writeObject()调用),这可能会导致流头问题,因为它们可能会多次引用相同的对象(通常是嵌套引用)由客户端的输入流读取
当对象输出流包装套接字输出流时会发生此问题,因为在正常序列化期间,对对象的第二次和后续引用不描述对象,而是仅使用引用.客户端的ObjectInputStream由于某些原因而不能正确地重建对象,因为它期望的头信息不同(它不会保留以前的readObject()调用); 这似乎只发生在套接字流,而不是文件I/O等.第一个 readObject()调用,而不是第二个和后续的调用不会发生此问题.
如果要继续使用相同的套接字流来编写多个对象,则需要在服务器代码中使用以下内容:
objectOut.reset()
objectOut.writeObject(foo);
Run Code Online (Sandbox Code Playgroud)
reset()调用重新初始化流,忽略先前沿流发送的任何对象的状态.这可确保每个对象都完整地发送,而不需要通常用于压缩ObjectOutputStream数据并避免重复的句柄类型引用.效率较低,但客户端读取时应该没有数据损坏.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           9821 次  |  
        
|   最近记录:  |