以下贴出来的代码为通过ObjectInputStream(OutputStream)在客户端与服务器端之间交互时传输的对象,提供的图片中一个是客户端的代码片段,一个是服务器端的代码片段。
现在问题出在当客户端输完账号密码点击确定时,客户端卡死(应该是线程阻塞)。服务器端抛出异常 :java.lang.ClassNotFoundException: com.wish.data.TransferObject(注:异常后面的包 是客户端的地址,而异常是服务器端抛出的)
并且指向的目标时服务器端72行 Object obj = ois.readObject();
注:实现了Serializable的几个类 (TransferObject、User)以及枚举TransferObjectType在客户端和服务端中均创建且 内容是一样的
已经卡了几天了,跪求大神指点。。。先谢谢了
import java.io.Serializable;
public class TransferObject implements Serializable{
private static final long serialVersionUID = 1L;
private TransferObjectType type;
private T object;
public TransferObject(TransferObjectType type){
this.type = type;
}
public void setObject(T object){
this.object = object;
}
public T getObject(){
return object;
}
public TransferObjectType getType(){
return type;
}
}
public enum TransferObjectType {
LOGIN, // 用户登录
FILE, // 传输文件
}
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String userName;
private String userPassword;
public void setUserName(String str){
this.userName = str;
}
public String getUserName(){
return userName;
}
public void SetUserPassword(String str){
this.userPassword = str;
}
public String getUserPassword(){
return userPassword;
}
}
先把客服端io中的缓存清除了 , 再看看服务端是否能够获取到数据
是直接客户端中oos.flush()吗?
这个是客户端连接的代码,麻烦帮我看看。。还有麻烦解释的话不要说太专业的术语。小弟没有受过专业培训,只是酷爱编程自学的 所以台专业的术语可能不是太懂。。。。谢谢了
public boolean connectToServerByObject(String userName,String userPassword){
boolean bool = false;
//String str = null;
try {
socket = new Socket("127.0.0.1" , 5888);
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
ObjectInputStream ois = new ObjectInputStream(is);
TransferObject tro = new TransferObject(TransferObjectType.LOGIN);
User u = new User();
u.setUserName(userName);
u.SetUserPassword(userPassword);
tro.setObject(u);
oos.writeObject(tro);
oos.flush();
bool = ois.readBoolean();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bool;
//return false;
}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource().equals(login)){
if(userName.getText().length() < 1 || userPassword.getText().length() < 1){
JOptionPane.showConfirmDialog(this,"内容不允许为空,请重新输入");
return;
}
//String [] str = {userName.getText(),new String(userPassword.getPassword())};
if(connectToServerByObject(userName.getText(),new String(userPassword.getPassword()))){
setVisible(false);
new MainFrame();
}else{
JOptionPane.showConfirmDialog(this,"账号或密码错误,请重新输入");
userPassword.setText(null);
}
}
if(e.getSource().equals(exit)){
System.exit(0);
}
}
将客户端的中的代码ObjectInputStream ois = new ObjectInputStream(is);去掉或者采用线程的方式处理read操作,参考这个http://blog.csdn.net/wang_hua_yi/article/details/17382015即可解决。
你客户端阻塞就是因为ObjectInputStream的问题,已经测试过了。你试试吧。其他没有问题。
谢谢两位的解答,问题已经解决了。问题出在TransferObject类中。客户端和服务端的TransferObject类的包名不一致造成 服务端不能序列化客户端传过来的TransferObject对象。 开始没有考虑到会是包名的问题,所以这方面并未贴出。。。虽然没有直接帮忙解决,但还是谢谢了。。所以我想将悬赏平均分配给两位,应该怎么操作呢?
TransferObject类没找到,是不是通信出了问题?