补回前天的
这天是突破最大的,也是最艰难的一天。具体流程:
Java Socket实战之二 多线程通信 - kongxx的专栏 - 博客频道 - CSDN.NET这个帖子成了突破口,里面正好有一个ObjectOutputStream的例子,也有传String的,String的代码贴到工程里完全没问题,一切正常。但是Object不行,开始debug之旅。
1.android 2.3以上的系统禁止在UI的主进程开socket或者是超过一定时间的通信吧,反正乱七八糟的。那就用2.2的模拟器,报找不到类的错误。
android socket遇到的问题 - 张兰云 - 博客园
2.公共类的名字必须完全一致,而且所在的package的名字也要一样。还要在类里面加上ID。
3.中间还遇到一个怪问题,还以为是64位机的问题后来参考这个,Internal Error (classFileParser.cpp:3075), pid=520, tid=3636 Error: ShouldNotReachHere() - wdzayyt的专栏 - 博客频道 - CSDN.NET有莫名其妙好了,怪。
就这样可以了,终于能穿object了。
试试小聪明,把例子里的server拷到我的server里,运行,然后让例子中的client去访问它,居然不行。试过各种方法,还是在readObject那里出错。
最后的解决办法很狼狈,把原server里的文件全都拷到这个例子工程下。例子Client可以访问了,我的Client还是访问不了,后来把4445端口改为10000就可以了,吐血。
再就是ois的方法稍微改了下,从ois=new ObjectInputStream(s.getInputStream());
ois = new ObjectInputStream(new BufferedInputStream(s.getInputStream()));
改写整个的TCPserver,从用PrintWriter,BufferedReader到ObjectInputStream.中间还遇到个bug
java.io.StreamCorruptedException: invalid type code: 4C
愿意是我用的printwrite写,用ObjectInputStream接收的。
实验的时候,模拟器很恼人,总是要卸载再重新装,不然用户就登不上,终于忍不住了,在debug模式下看看server到底有什么猫腻,发现server居然停止数据库执行完没有结果。怎么会这样?原来输入用户名的时候在后面多加了空格,空格也算字符。。。。。
server改写完了,现在client和server开始传对象了。判断语句不能写
if(m,gettype()=="Login") 而应是if(m.getType().equalsIgnoreCase("Login"))
可以登录了,开心。