一个简单ObjectInputStream ObjectOutputStream的问题

fxp007 2008-04-20 02:06:20
下面这段代码总是调不通,请教各位。多谢
Client:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {

public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 2222);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

Request req = new Request("login");
req.setData("UserName", "名字");
req.setData("Password", "密码");

oos.writeObject(req);
oos.flush();
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}


import java.io.Serializable;
import java.util.Properties;

public class Request implements Serializable {

private String type;//请求类型
private Properties parameters;//请求所带的参数
private static final long serialVersionUID = 800120791203985L;

public Request(String type) {
parameters = new Properties();
this.type = type;
}

public void setData(String key, String value) {
this.parameters.setProperty(key, value);
}

public String getData(String key) {
return this.parameters.getProperty(key);
}

public Properties getAllParameters() {
return this.parameters;
}

public String getType() {
return type;
}
}


Server:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {

public static void main(String[] args) {
try {
ServerSocket socket = new ServerSocket(2222);
Socket sock = socket.accept();
ObjectInputStream ois = new ObjectInputStream(sock.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream());

Request req;
req=(Request)ois.readObject(); //#1

} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); //#2
} catch (ClassNotFoundException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}


import java.io.Serializable;
import java.util.Properties;

public class Request implements Serializable {
private String type;//请求类型
private Properties parameters;//请求所带的参数

public Request(String type) {
parameters = new Properties();
this.type = type;
}

public void setData(String key, String value) {
this.parameters.setProperty(key, value);
}

public String getData(String key) {
return this.parameters.getProperty(key);
}

public Properties getAllParameters() {
return this.parameters;
}

public String getType() {
return type;
}
}


连接的时候Server端#1处会抛出错误到#2处。
请问是什么原因?谢谢了
...全文
159 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
fxp007 2008-04-20
  • 打赏
  • 举报
回复
还是不行...我把两边的serialVersionUID改为1L了,但还是报错。不过是从ClassNotFoundException中报错了。
panxuan 2008-04-20
  • 打赏
  • 举报
回复
楼上的可以尝试。
jasonwhy 2008-04-20
  • 打赏
  • 举报
回复
你在client端定义了private static final long serialVersionUID = 800120791203985L;
在服务端也要定义private static final long serialVersionUID = 800120791203985L;
server端的 req成员对象在main方法外定义,自己添加打印语句测试通过
显示结果:
Request@16caf43
{UserName=name, Password=password}


import java.io.Serializable;
import java.util.Properties;

public class Request implements Serializable {
/**
*
*/
private static final long serialVersionUID = 800120791203985L;
private String type;
private Properties parameters;
public Request(String type) {
parameters = new Properties();
this.type = type;
}

public void setData(String key, String value) {
this.parameters.setProperty(key, value);
}

public String getData(String key) {
return this.parameters.getProperty(key);
}

public Properties getAllParameters() {
return this.parameters;
}

public String getType() {
return type;
}
}



import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main{

private static Request req; //req 定义为成员变量

public static void main(String[] args) {
try {
ServerSocket socket = new ServerSocket(2222);
Socket sock = socket.accept();
ObjectInputStream ois = new ObjectInputStream(sock.getInputStream());
//ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream());


req=(Request)ois.readObject(); //#1
System.out.println(req);
System.out.println(req.getAllParameters());



} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); //#2
} catch (ClassNotFoundException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
fxp007 2008-04-20
  • 打赏
  • 举报
回复
补充下:
报的错误如下:
SEVERE: null
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.net.SocketInputStream.read(SocketInputStream.java:182)
at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2247)
at java.io.ObjectInputStream$BlockDataInputStream.peek(ObjectInputStream.java:2540)
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2550)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1297)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at javaapplication1.Main.main(Main.java:29)
fxp007 2008-04-20
  • 打赏
  • 举报
回复
搞定了。是Server和Client的Request类不在同一个名称的包里,在两边都单独建一个一样名称的包,把Request放进去就好了。谢谢楼上的两位。不过我还想知道这是为什么?

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧