我有一个客户端发送数据到服务器端,有普通数据也有对象但是如果在发送了普通数据后紧跟着发送对象的话就会有一个
StreamCorruptedException:invalid stream header
比如一下的代码
客户端代码:
import java.net.*;
import java.io.*;
import temp.TempObject;
class TransferObject
{
public static void main(String[] args){
try {
TempObject to=new TempObject(3,"ccc");
Socket s=new Socket("localhost",5566);
PrintWriter out=
new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
s.getOutputStream())), true);
out.println("test");
ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());
oos.writeObject(to);
oos.close();
s.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
服务器段:
import java.net.*;
import java.io.*;
import temp.TempObject;class TransferObject
{
public static void main(String[] args) throws Exception
{
ServerSocket ss=new ServerSocket(5566);
Socket s=null;
ObjectInputStream ois=null;
try {
while(true){
s=ss.accept();
BufferedReader bis=new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println (bis.readLine());
ois=new ObjectInputStream(s.getInputStream());
TempObject to=(TempObject)ois.readObject();
System.out.println (to.getName());
System.out.println (to.getId());
}
}
catch (Exception ex) {
ex.printStackTrace();
}
ois.close();
s.close();
ss.close();
}
}
临时对象TempObject:
package temp;
import java.io.Serializable;
public class TempObject implements Serializable{
private int id;
private String name;
public TempObject(int id,String name)
{
this.id=id;
this.name=name;
}
public int getId()
{
return id;
}
public String getName()
{
return name;
}
}要怎样才能处理这个问题,发送对象和普通数据互不干扰
StreamCorruptedException:invalid stream header
比如一下的代码
客户端代码:
import java.net.*;
import java.io.*;
import temp.TempObject;
class TransferObject
{
public static void main(String[] args){
try {
TempObject to=new TempObject(3,"ccc");
Socket s=new Socket("localhost",5566);
PrintWriter out=
new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
s.getOutputStream())), true);
out.println("test");
ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());
oos.writeObject(to);
oos.close();
s.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
服务器段:
import java.net.*;
import java.io.*;
import temp.TempObject;class TransferObject
{
public static void main(String[] args) throws Exception
{
ServerSocket ss=new ServerSocket(5566);
Socket s=null;
ObjectInputStream ois=null;
try {
while(true){
s=ss.accept();
BufferedReader bis=new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println (bis.readLine());
ois=new ObjectInputStream(s.getInputStream());
TempObject to=(TempObject)ois.readObject();
System.out.println (to.getName());
System.out.println (to.getId());
}
}
catch (Exception ex) {
ex.printStackTrace();
}
ois.close();
s.close();
ss.close();
}
}
临时对象TempObject:
package temp;
import java.io.Serializable;
public class TempObject implements Serializable{
private int id;
private String name;
public TempObject(int id,String name)
{
this.id=id;
this.name=name;
}
public int getId()
{
return id;
}
public String getName()
{
return name;
}
}要怎样才能处理这个问题,发送对象和普通数据互不干扰
比如:
先发送:out.println("000111110100011");
服务器接收:Strint str = bis.readLine();
解析此串,然后根据0,1标志分别读取文本和对象.
public class Message {
private String title;
}public class TextMessage extends Message{
private String content;
}public class MultiMediaMessage extends Message{
private byte[] attachment;
}这样读就是了:Message msg = (Message) input.readObject(); // 这是文本。
Message msg = (Message) input.readObject(); // 这是多媒体。