有问题,你的SERVER;
while(true){
s=ss.accept();
inStream=new ObjectInputStream(s.getInputStream());
outStream=new ObjectOutputStream(s.getOutputStream());
outStream.writeObject(vector);
}
程序运行后两边都读SOCKET,所以出错了;
while(true){
s=ss.accept();
inStream=new ObjectInputStream(s.getInputStream());
outStream=new ObjectOutputStream(s.getOutputStream());
outStream.writeObject(vector);
}
程序运行后两边都读SOCKET,所以出错了;
更改成为outStream.elementAt(0) ;
实验一下,另外错误信息详细一些。
s=ss.accept();
inStream=new ObjectInputStream(s.getInputStream());
outStream=new ObjectOutputStream(s.getOutputStream());
outStream.writeObject(vector);
//added
outStream.flush();
outStream.close();
}
C:\Temp\socket>java ObjectClient
connection request...
connection OK
java.io.StreamCorruptedException: invalid stream header起初是直接传逻辑对象,后来看别人的例子,我将对象装到Vector中传输,还是一样的出错信息。请指点....
接受端也转化一下,看有没有问题。
import java.net.*;
import java.net.ServerSocket;
import java.util.Vector;public class ObjectServer {
ServerSocket ss=null;
Socket s=null;
ObjectInputStream inStream=null;
ObjectOutputStream outStream=null;
FileInputStream fin = null;
ObjectObj obj = null;
Vector vector = new Vector(2);public ObjectServer() {
try{
ss=new ServerSocket(7650);
// s.setSoTimeout(3000);
obj = new ObjectObj();
obj.setID(1);
obj.setName("wukesong");
vector.add(obj);
ObjectObj obj2 = new ObjectObj();
obj2.setID(5);
obj2.setName("asdfasdfasd");
vector.add(obj2);
}catch(Exception e){
e.printStackTrace();
}
}void waitForClient(){
try{
while(true){
s=ss.accept();
System.out.println("已经连接");
outStream=new ObjectOutputStream(s.getOutputStream());
outStream.writeObject(vector);
outStream.flush();
Thread.sleep(1000); }
}catch(Exception e){
e.printStackTrace();
}
}public static void main(String[] args)
{
ObjectServer socketServer1 = new ObjectServer();
socketServer1.waitForClient();
}
}import java.io.*;class ObjectObj implements java.io.Serializable
{
private int id = 0;
private String name = ""; public int getID()
{
return id;
}
public void setID(int pID)
{
this.id = pID;
} public String getName()
{
return name;
}
public void setName(String pName)
{
this.name = pName;
}
}import java.net.*;
import java.io.*;
import java.util.*;public class ObjectClient{
Socket socket=null;
DataInputStream inStream=null;
DataOutputStream outStream=null;
FileOutputStream fout = null; public ObjectClient() {
try{
System.out.println("connection request...");
socket=new Socket("192.168.0.173",7650);
System.out.println("connection OK");
ObjectInputStream oin = new ObjectInputStream(socket.getInputStream());
System.out.println("get stream...");
//socket.setSoTimeout(3000);
Vector vector = (Vector)oin.readObject();
int size = vector.size();
System.out.println("大小 :"+vector.size());
for(int i=0;i<size;i++)
{
ObjectObj obj = (ObjectObj)vector.get(i);
System.out.println("id="+obj.getID()+"");
System.out.println("name="+obj.getName()); }
oin.close();
socket.close();
}catch(Exception e){
e.printStackTrace();
}
} public static void main(String[] args) {
ObjectClient socketClient1 = new ObjectClient();
}
}
outStream=new ObjectOutputStream(s.getOutputStream());
就是一个很好的例子。
2.由于安全性考虑,public 属性在网络传输中是不允许的。
3.建议调用某实例的close方法之前最好判断null操作,特别是网络操作。
4.异常信息在调试时期用printStackTrace()比较好。