自定义对象myClass:
public class myClass implements Serializable{
private static final long serialVersionUID = 1L;
private String name = "qiujie";
private DataOutputStream dos;
public String getString(){
return name;
}
public DataOutputStream getDos() {
return dos;
}
public void setDos(DataOutputStream dos) {
this.dos = dos;
}
public void setname(String name)
{
this.name = name;
}
}
server端:
public class server {
public static void main(String[] args)
{
try {
ServerSocket server = new ServerSocket(8866);
System.out.println("system is running at localhost:8866");
Socket socket = server.accept();
OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
myClass myclass = new myClass();
myclass.setname("yangfei");
myclass.setDos(dos);
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(myclass);
} catch (Exception e) {
// TODO: handle exception
}
}
}
红色代码不设置时程序正常运行,是什么问题呢?
错误信息
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.io.DataOutputStream
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1332)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at com.testClient.client.main(client.java:25)
Caused by: java.io.NotSerializableException: java.io.DataOutputStream
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at com.hashmap.server.main(server.java:24)
public class myClass implements Serializable{
private static final long serialVersionUID = 1L;
private String name = "qiujie";
private DataOutputStream dos;
public String getString(){
return name;
}
public DataOutputStream getDos() {
return dos;
}
public void setDos(DataOutputStream dos) {
this.dos = dos;
}
public void setname(String name)
{
this.name = name;
}
}
server端:
public class server {
public static void main(String[] args)
{
try {
ServerSocket server = new ServerSocket(8866);
System.out.println("system is running at localhost:8866");
Socket socket = server.accept();
OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
myClass myclass = new myClass();
myclass.setname("yangfei");
myclass.setDos(dos);
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(myclass);
} catch (Exception e) {
// TODO: handle exception
}
}
}
红色代码不设置时程序正常运行,是什么问题呢?
错误信息
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.io.DataOutputStream
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1332)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at com.testClient.client.main(client.java:25)
Caused by: java.io.NotSerializableException: java.io.DataOutputStream
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at com.hashmap.server.main(server.java:24)
当不加 private DataOutputStream dos 变量时,myClass 是一个正确的Serializable的类
如果myClass代表了你想在客户端之间传送的信息,我觉得不应该在这里在DataOutputStream呀.
如果myClass是代表了你的客户端,那似乎应该把想传送的信息写到DataOutputStream里.还是我理解的有问题?
http://topic.csdn.net/u/20120328/09/98640d8b-44bf-430b-9588-742ec964bab4.html?43763
MyClass.javapublic class MyClass implements Serializable {
String name;
String message;
int srcPort;
public MyClass(){}
public MyClass(String name, String message, int srcPort) {
super();
this.name = name;
this.message = message;
this.srcPort = srcPort;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public int getSrcPort() {
return srcPort;
}
public void setSrcPort(int srcPort) {
this.srcPort = srcPort;
}
}
Client.java
public class Client{
ServerSocket server;
Thread in;
int port;
boolean connect = true;
public Client(int port){
this.port = port;
try {
server = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
}
void runReceiveThread(){
in = new Thread(){
@Override
public void run() {
while(connect){
try {
Socket inSocket = server.accept();
InputStream ins = inSocket.getInputStream();
ObjectInputStream data = new ObjectInputStream(ins);
MyClass message = (MyClass)data.readObject();
System.out.println(port + " receive a object :"+ message.getName() + " - " + message.getMessage() + " - " + message.getSrcPort());
if(message.getMessage().equals("bye")){
connect = false;
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
};
in.start();
}
void sendMessage(final String m, final int p){
try {
Socket outSocket = new Socket(InetAddress.getLocalHost(), p);
ObjectOutputStream outs = new ObjectOutputStream(outSocket.getOutputStream());
MyClass toSend = new MyClass("Server" + port, m, port);
outs.writeObject(toSend);
System.out.println(port + " Send a object to " + p + " Content:" + toSend.getName() + " - " + toSend.getMessage() + " - " + toSend.getSrcPort());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
}main 程序 public static void main(String[] args) {
Client c1 = new Client(7777);
Client c2 = new Client(9999);
c1.runReceiveThread();
c2.runReceiveThread();
c1.sendMessage("Hello c2, this is c1", 9999);
c2.sendMessage("c1, this is c2", 7777);
c1.sendMessage("how er you doing", 9999);
c2.sendMessage("Go away", 7777);
c1.sendMessage("bye", 9999);
c2.sendMessage("bye", 7777);
}
流你都要序列化?