用Socket实现一个简单的P2P通讯软件,本来没什么难的,但碰到这个ClassNotFound问题确实困扰了我很久,解决后,到博客记下来。
客户端的代码如下:
//设置客户端的信息
ClientInfo clientInfo = new ClientInfo();
clientInfo.setIP("127.0.0."+new Random().nextInt(256));
clientInfo.setPort(9211);
clientInfo.setClientName(clientInfo.getIP());
System.out.println("发送客户端的IP信息到服务器");
//将客户端的基本信息发送给服务器
Socket so= new Socket("127.0.0.1", 9999);
ObjectOutputStream oos=new ObjectOutputStream(so.getOutputStream());
oos.writeObject(clientInfo);
oos.flush();
其中clientInfo是个对象,发送的时候没问题。但是服务器端接受,并要自动开箱封装的时候,报错了。上服务端代码:
s = ss.accept();
// 接收客户端发来的信息.
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
ClientInfo clientInfo = (ClientInfo)ois.readObject();
最后一句报ClassNotFound的错误。提示找不到ClientInfo这个类,包名提示的确实客户端的位置,在服务器端当然找不到了,我一开始以为是序列没有统一,加上Serializable后,还是不行,没办法,只好将这个ClientInfo类提出来,提到src下的comm包中,这样客户端和服务器端定位这个类的时候,都是package org.comm。最终问题解决。
PS:我觉得这样不是一个很好的方法,会破坏软件结构,一开始并没有考虑到会有这个问题,认为在客户端和服务器端的ClientInfo类是一模一样的,就没什么问题了,但开箱的时候居然去找封箱时用的那个类,我也是醉了。希望有大神不吝赐教,小菜鸟在此先谢过了。