《Fantasy Sky》的进展顺利,一切继续着。今天下午把10种职业基本补齐了,除了小偷还缺4张截图,小事而已。于是想来张全家福,突然发现bug。
同时登陆多个账号时,头几个显示还正常,后面的就看不见前面同张地图内的人了。debug半天,发现数据完全正常,接收发送都处理到了,可真杀死脑细胞啊。
最终在客户端想了个办法把每次socket接收的数据都打印出来看看,终于发现问题所在:
swf在接收socket的数据时,是用触发侦听进行的。然而可能服务器端两次发送的数据由于延迟原因同时到达客户端了,此时由于程序编写的问题,就会出现冲突。
比如接收到 str1 这一段数据,客户端判别应该生成一个人物a;接收到 str2 就该生成b。由于延迟,二者合到一起了,客户端读取的是 str1 + str2 的内容,错误就出现在这里了。
解决得办法就是换用xmlsocket对象,它用\0字符为结尾标识每次传送数据的结束,不会起冲突;又或者仍然用低层的socket对象,它有readInt()方法,可以每次在数据开头设个长度,用来标识此次接收多少字节。
前者容易,后者更强大。综合来说,我先用前者试一试。
Posts Tagged ‘socket’

本博客所有文章均采用