`
zhuyifeng
  • 浏览: 45038 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

关于网络通信中如何传输对象的问题

 
阅读更多

      我们不管在用TCP/IP连接或是UDP连接传输数据时有时会遇到一个问题。如果对于一个对象拥有很多个属性值,比如说一个学生类对象有年龄,性别,学校,学号等等的属性以及一些方法。服务器端有个Student的类,我们需要把学生的这些数据发送给客户端,而我们的服务器上存储了成千上万个Student类对象,那么我们应该怎么传输呢?

 

 

 

 

解决方法一:

      采用某种协议将这些数据分批发送,我们一般在java连接中传输用到的流是DataOutputStream(以下简称dos),对于每一个学生对象,根据他们的年龄,性别,学校,学号这四个属性我们可以采取XMPP的传输方式构建一个String——"<student><age>[年龄数据]</age><sex>[性别数据]</sex><school>[学校数据]</school><id>[学号数据]</id></student>",然后用dos.writeBytes(String s)方法直接传输过去,客户端再将收到的数据自行解析最后还原。

      在我咨询的帮助中,大多数人也是建议这一种方法。不过我始终觉得这一种方法太过于麻烦,首先是协议得斟酌一番,然后对于Student类中的方法我们无法传输过去,如果在客户端需要用到这些方法时,必须在客户端自定义和服务器的Student类内容一样的类(称为ClientStudent),然后再通过接收到的数据new ClientStudent();我是一个怕麻烦的人╮(╯▽╰)╭,所以有没有简单一点的方法呢?有的,就是第二种。

 

 

解决方法二:

      我们在服务器端要发送成千上万个Student对象(st1,st2......),为何我们不直接将st1等发送给客户端呢?这里有几个问题,首先是我们查阅DataOutputStream类的API,并没有在里面发现write这种数据类型的方法,如果我们需要发送这种数据类型,那么就只能选择以下两种方法:①将st1对象转变成byte数组,然后再通过dos的writeByte()方法传递过去;②构建一个ObjectOutputStream(以下简称oos),然后调用它的writeObject(st1)方法直接传递过去。由于这两种方法都需要实现序列化,所以本质上是一样的,在接下来的过程中我们就以writeObject()方法为例。那么什么是序列化呢?

 

      百度百科的解释是:序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

 

      搞不懂没关系,java的类实现序列化非常简单,只需要implements Serializable接口就行了,而且并不需要实现任何方法,因为该接口里没有定义方法。

 

      以Student类为例,我们写成public class Student implements Serializable{}就行了。

 

      实现了序列化之后就可以将数据传输过去了,并且我们在客户端也能够接受到一致的数据。接收到数据之后是不是就OK了呢?别急,我们还需要做一件事,就是将接收到的数据反序列化成Student对象。我一开始是将服务器定义的Student类原封不动的复制给客户端,然后再进行强制转换Student st = (Student) 从流中读取的Object对象;(好像和第一种方法差不多呵~~),但是这样一运行程序就立马报错了,会抛出类型无法转换的问题。大家应该想得通吧,虽然我们定义的内容是一样的,但是在程序看来这完全就是两码子东西,必然会报错的啊(区别于第一种方法,第一种方法是通过读取到的基本数据类型重新构造对象)。那么怎么让程序认识这个类呢?这是最后一个难题,解决了他我们传输对象的问题就完全解决了!我们会发现一个有趣的现象,如果我们writeObject中传输的对象是java中原本有的类,比如说Font类,然后在客户端进行强制转换,程序并不会报错。为什么呢?现在我们转回来看上面的问题~聪明的读者也许已经想到解决方案了,那就是将我们实现序列化的Student类打包成jar文件,然后服务器和客户端都导入这一个文件,这样就能正常的识别类了,强制转换也就不会报错了。至此,任务已成功解决!

 

 

 

 

 

后记思考:

一、两种方法各有千秋,也许第一种效率会高点,因为传送的只是基本数据类型,且避免的更多无谓的数据在网络间通信,成功节省带宽。而第二种很明显会简单点,虽然前期在实现过程中会麻烦一点,但是在后期的程序中只Student类的用法就和java本身具有的类用法差不多了。但是对于我这种懒人来说,还是选择第二种理所当然一点(~﹃~)~zZ

 

二、在Student类中所使用的类也必须全部实现序列化,比如说在Student类中有个school属性,而这个属性又是School 类的一个对象,那么School对象也要实现序列化,以此类推,如果School类中又有类,那么那个类也要序列化……

 

三、在java中有些类是不能进行序列化的,比如说java.net.Socket,java.io.InputStream……,这也就是说你的自定义类中不能存在这些类的对象,否则必定会报错!

 

四、传输对象肯定不止这两种方法,就我目前在网上查找的就包括一个什么“类锁定”的方法(没有详细说明,也不知道是否真的能解决),还有一个java中已经包括的RMI(Remote Method Invocation )系列类的使用,是可以用来加载远程类。RMI貌似是为了实现分布式应用和云计算产生的,搞这个好像有点小题大作了,不过应该也是能够解决的。更多的方法欢迎补充~~~

分享到:
评论

相关推荐

    巧用Android网络通信技术,在网络上直接传输对象demo

    总结来说,"巧用Android网络通信技术,在网络上直接传输对象demo"这个主题涵盖了Android的网络编程基础,对象序列化,Socket通信,以及服务器和客户端的交互逻辑。通过学习这个示例,开发者可以更好地理解和掌握...

    网络游戏-通信网络中的对象传输控制.zip

    在网络游戏的开发与运营中,通信网络中的对象传输控制是一个至关重要的环节。这一主题涉及到游戏服务器与客户端之间数据的高效、稳定、安全...在实际开发中,开发者需要综合考虑各种因素,以实现最佳的网络通信效果。

    MinaUdp通信对象传输例子

    在这个例子中,我们将深入探讨如何利用Mina进行UDP(User Datagram Protocol)通信,并实现对象的传输。 **UDP简介** UDP是一种无连接的、不可靠的传输协议,它不保证数据包的顺序、完整性和可靠性,而是以尽可能快...

    socket通信文件传输

    Socket,也称为“套接字”,是网络通信中的一个抽象概念,它代表了两台机器之间的一个连接端点。在TCP/IP模型中,Socket接口提供了应用层与传输层之间的交互,允许应用程序发送和接收数据。 2. **TCP/IP协议**: ...

    网络通信,图片,文件,字符串传输

    在Java编程领域,网络通信是一项核心技能,尤其在构建分布式系统和实时数据交换的应用中。本项目主要关注的是如何通过Java实现网络上的数据传输,包括字符串、文件和图片。下面将详细阐述Java网络通信的基本原理、...

    C#Socket 封装了Tcp/Udp传输字串、文件、对象

    网络通信 Tcp/Udp 传输字串、文件、对象 Tcp粘包、半包 1.封装了Tcp/Udp传输字串、文件、对象的细节,处理了Tcp粘包问题 2.测试代码设计原始Socket、TcpListener、TcpClient、UdpClient的使用 3.测试代码包括一个...

    案例三:java网络编程(对象流传输)

    在Java中,我们可以利用对象流(Object Stream)来发送和接收Java对象,这极大地扩展了网络通信的能力,不再局限于基本类型和字符串的传输。本案例将探讨如何通过Java进行对象流传输,实现网络上的对象共享。 首先...

    java socket使用加密协议传输对象

    ### Java Socket 使用加密协议传输对象:深入解析与实践 在当今互联网时代,数据安全成为企业和个人用户关注的焦点。在Java开发中,Socket编程是一种常见的网络通信方式,它允许不同计算机上的应用程序通过网络进行...

    计算机网络通信中的信息传输控制技术探讨.pdf

    【计算机网络通信中的信息传输控制技术探讨】 计算机网络通信是现代社会信息交流的基础,它通过将计算机技术和通信技术相结合,使得信息能在不同的设备间高效、安全地传输。在计算机网络通信中,信息传输控制技术...

    网络通信程序源码

    CSocket类提供了如`GetLastError()`和`Close()`等函数,帮助开发者诊断和处理网络通信过程中的问题。 5. **示例程序——CHAT:** - 压缩包中的"CHAT"文件很可能包含了完整的网络通信聊天应用源码。服务器端负责...

    netty传输kryo序列化的对象基于socket传输

    在IT行业中,网络通信是关键的一环,尤其是在分布式系统和实时通信系统中。Netty作为一个高性能、异步的网络应用框架,广泛应用于TCP/IP协议栈的实现,如HTTP、FTP、SMTP等。Kryo则是一种高效的Java对象序列化库,...

    网络通信 C#语言 TCP网络通信

    通过实践这个TCP通信程序,你可以深入了解网络通信的流程,掌握C#中实现网络通信的方法,这对于开发涉及网络交互的软件,如即时聊天工具、文件传输应用等,具有重要的学习价值。同时,理解TCP协议的工作机制,也有助...

    C#网络通信源码全集合

    在IT行业中,网络通信是构建分布式系统和应用程序的关键部分,特别是在C#编程环境中。"C#网络通信源码全集合" 提供了丰富的资源,帮助开发者深入理解和实践C#语言在网络编程中的应用。这个资源包可能包含了各种网络...

    socket通信 文件传输等的功能

    Socket通信是计算机网络编程中的重要组成部分,主要用于实现进程间的网络通信。它提供了低级别的、面向连接的、双向的数据通信接口,让两个运行在网络上的程序能够相互通信。在这个主题下,我们将深入探讨Socket通信...

    网络游戏-在通信网络中管理对象的方法及其实现装置.zip

    2. 网络通信:网络游戏中的对象管理离不开网络通信。TCP/IP协议常用于网络游戏,因为它提供可靠的、顺序的数据传输。然而,由于网络延迟和丢包问题,开发者通常会使用UDP协议进行实时交互,并结合TCP进行可靠传输。...

    vb网络通信协议分析与应用实现

    9. **实战项目**:最后,书中的实例源码涵盖了实际的网络通信项目,如简单的聊天室、文件传输、Web服务客户端等,帮助读者将理论知识转化为实际应用能力。 通过对这本书的学习,读者不仅可以掌握VB网络编程的基本...

    Android系统应用开发 实验五 网络通信 实验报告

    在Android系统应用开发中,网络通信是至关重要的一个环节,特别是在构建交互性强的应用时。本实验旨在让学生深入了解Android网络通信技术,并通过实际操作掌握不同类型的网络通信方式,包括利用WebView实现浏览器...

    实现P2P网络通信.rar

    《实现P2P网络通信——基于Java的深度解析》 P2P(Peer-to-Peer)网络通信是一种去中心化的网络架构,其中每个节点既是服务的提供者也是服务的消费者。这种模式在分布式系统、文件共享、流媒体传输等领域有着广泛...

    python网络通信基础资料

    Python网络通信基础是编程领域中的重要一环,它允许程序之间通过TCP(传输控制协议)和UDP(用户数据报协议)进行数据交换。在Python中,可以使用标准库socket来实现这些功能,使得网络编程变得相对简单。下面将详细...

    硕士研究生课程 计算机通信与网络技术 网络通信技术 第09章 传输层 共115页.pptx

    ### 传输层协议概述 #### 一、传输层在计算机网络中的地位 传输层作为计算机网络体系结构的核心组成部分,位于应用层与网络层...通过对传输层及其协议的深入学习和研究,可以更好地理解和解决实际网络通信中的问题。

Global site tag (gtag.js) - Google Analytics