欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【未解决问题】关于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中的属性打印

【未解决问题】关于Socket编程:客户端、服务端对象流交互数据丢失的问题

接收之后,首先打印一遍【未解决问题】关于Socket编程:客户端、服务端对象流交互数据丢失的问题

(三)运行结果

【未解决问题】关于Socket编程:客户端、服务端对象流交互数据丢失的问题
可以明显看到,发送的数据 “list” 中的商品有两种

【未解决问题】关于Socket编程:客户端、服务端对象流交互数据丢失的问题
不过接收到的数据就只剩一个数据了

(四)问题排查

使用断点调试、加入打印信息等方法,初步得出数据丢失的特征:
i. 每一次运行程序第一次添加商品不会丢失
ii.从第二次开始就会出现接收端新商品没有加入的情况

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

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

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

(五)心得体会

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

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

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

相关标签: 学习总结 java