【未解决问题】关于Socket编程:客户端、服务端对象流交互数据丢失的问题
程序员文章站
2022-06-24 19:07:58
问题引入:服务端将一个对象发送给客户端,客户端接收到的对象数据丢失。(一)问题出处客户端://客户端请求代码片: try { //Message 为封装的消息类型,由于往返的对象类型可能不是一种 //其两个属性为 “封装的对象” 和 “请求类型” //MessageType为一个接口,里面添加一些常量,供服务端识别用户请求的动作 Message message = new Message(user,MessageType.MESSAG...
问题引入:
服务端将一个用户对象发送给客户端,客户端接收到的对象数据丢失。
(一)问题出处
客户端:
//客户端请求代码片:
try {
//Message 为封装的消息类型,由于往返的对象类型可能不是一种
//其两个属性为 “封装的对象” 和 “请求类型”
//MessageType为一个接口,里面添加一些常量,供服务端识别用户请求的动作
Message message = new Message(user,MessageType.MESSAGE_BUY);
//oos为ObjectOutputStream类型的一个全局引用,指向对象输出流对象
oos.writeObject(message);
oos.flush();
} catch (Exception e) {
e.printStackTrace();
}
服务端:
//服务端代码片:
//ois为ObjectInputStream类型的一个全局引用,指向对象输入流对象
Message message = (Message) ois.readObject();
//省略其它请求类型...
case MessageType.MESSAGE_BUY: {
//获得此用户对象
User user = (User) message.getDate();
//之后将此用户变更的信息写入文件等操作
Shop.addUserProduct((User) message.getDate());
oos.flush();
break;
}
(所有会出异常的地方都已写入try块,且无异常产出)
(二)代码调试
在发送之前,将user中的属性打印
接收之后,首先打印一遍
(三)运行结果
可以明显看到,发送的数据 “list” 中的商品有两种
不过接收到的数据就只剩一个数据了
(四)问题排查
使用断点调试、加入打印信息等方法,初步得出数据丢失的特征:
i. 每一次运行程序第一次添加商品不会丢失
ii.从第二次开始就会出现接收端新商品没有加入的情况
1.借阅网上的资料,有说是因为 中文编码的问题,于是将所有属性信息改为英文,未解决问题。
2.咨询导师,导师说在一个机子上操作两个端口,可能会导致指针指向同一片内存的现象,于是将客户端,服务端部署在两台机子上,未解决问题
3.导师亲自书写代码,结果亦发生了数据丢失,是由 客户端向服务端返回数据的阶段
(五)心得体会
尽管Socket已是落伍的技术,不过在热门技术的底层,亦是Socket的逻辑。
虽然明白了Socket的工作过程,不过碰到了无法解决的问题,随着今后不断学习,去思考,去排查。
本文地址:https://blog.csdn.net/Aurora1004/article/details/110674893