问题引入:

服务端将一个用户对象发送给客户端,客户端接收到的对象数据丢失。

(一)问题出处

客户端:

//客户端请求代码片:

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中的属性打印

1f0aab0058d68cc74ff8c2cc8199e088.png

接收之后,首先打印一遍

f5f538e089058d0c1f6f1c9cf653b605.png

(三)运行结果

7226098c7396d5bc59d631ec6190aa5b.png

可以明显看到,发送的数据 “list” 中的商品有两种

b18fb3e0042e000beea844fe93fefb4b.png

不过接收到的数据就只剩一个数据了

(四)问题排查

使用断点调试、加入打印信息等方法,初步得出数据丢失的特征:

i. 每一次运行程序第一次添加商品不会丢失

ii.从第二次开始就会出现接收端新商品没有加入的情况

1.借阅网上的资料,有说是因为 中文编码的问题,于是将所有属性信息改为英文,未解决问题。

2.咨询导师,导师说在一个机子上操作两个端口,可能会导致指针指向同一片内存的现象,于是将客户端,服务端部署在两台机子上,未解决问题

3.导师亲自书写代码,结果亦发生了数据丢失,是由客户端向服务端返回数据的阶段

(五)心得体会

尽管Socket已是落伍的技术,不过在热门技术的底层,亦是Socket的逻辑。

虽然明白了Socket的工作过程,不过碰到了无法解决的问题,随着今后不断学习,去思考,去排查。

本文地址:https://blog.csdn.net/Aurora1004/article/details/110674893

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐