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数据并避免重复的句柄类型引用.效率较低,但客户端读取时应该没有数据损坏.