茹志鹃
正德职业技术学院,江苏 南京 211106
基于用户数据报协议的Java Socket数据通信
茹志鹃
正德职业技术学院,江苏 南京 211106
数据通信是网络的主要应用之一,随着网络的快速发展,大多程序设计语言都开发了实现数据通信的应用程序接口,Java语言也不例外。Java语言,因平台无关和多线程的特性,被广泛应用于Web开发中,其丰富的类库中提供了Socket套接字,应用程序可通过套接字向网络发出请求或者应答网络请求,非常方便的实现网络间的数据通信。基于用户数据报通信协议或者传输控制协议,利用Java语言的面向对象、多线程、可视化程序开发以及Socket套接字技术,可以非常简单的实现多个客户端之间的网络数据通信。
Socket;UDP;数据报;多线程
Java作为一种程序设计语言,简单、面向对象、不依赖于机器的结构、具有可移植性、安全性、并且提供了并发的机制、具有很高的性能,最大限度地利用了网络,还提供了丰富的类库,使程序设计者可以很方便地开发自己的系统。Java语言的众多特点中,最特别的就是与平台无关和多线程了,也因此被广泛用于Web开发中。java.net包中,提供了网络编程所需要各个类,通过这些类,可方便的开发网络间数据通信程序。
实现网络间的数据通信,必须基于传输层的两个服务质量不同的协议——TCP和UDP,Java类库中提供了DatagramSocket和DatagramPacket两个类来实现基于UDP协议的数据通信,同时也提供了Socket和ServerSocket两个类来实现基于TCP协议的数据通信,下面主要介绍基于UDP协议的数据通信。
1.1 UDP协议
UDP(User Datagram Protocol,用户数据报协议)协议是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,是一个简单的面向数据报的传输层协议,传送数据前并不与对方建立连接,在传输数据前,发送方和接收方相互交换信息使双方同步,对接收到的数据包也不发送确认信号,发送端不知道数据是否被正确接收,也不会重发数据,因此具有较好的实时性和工作效率。
1.2 SOCKET
所谓socket通常也称作“套接字”,是网络编程中的一个接口,用于描述IP地址和端口,是一个通信链的句柄,应用程序通过“套接字”向网络发出请求或者应答网络请求。
J a v a语言的U D P通信中,使用DatagramSocket类来创建收、发数据报的Socket对象。与TCP通信不同,它不存在“连接”的概念,取而代之的是一个数据报包DatagramPacket对象,这个数据报包本身包含IP地址、端口号和数据内容,据此可以知道发送方和目的地。
使用DatagramSocket的构造方法public DatagramSocket(int port)throws SocketException来创建数据报套接字,并绑定到指定的端口上。对于数据报的接收,主要使用DatagramPacket 类的public DatagramPacket(byte buf[],int length)方法构造DatagramPacket对象,来接收长度为length的数据报包,发送数据报使用public DatagramPacket(byte[] buf, int length, InetAddress address, int port)构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号。
程序的设计过程中,界面制作可使用Java开发的可视化编程工具,创建窗口后,添加输出信息的文本区域和输入信息的文本框两个控件,并且对回车事件和窗口关闭事件进行处理,这里不再介绍。下面主要介绍使用DatagramSocket和DatagramPacket两个类编写数据通信的代码和为提高程序的运行速度所采用的多线程机制。
2.1 创建接收和发送程序
导入网络编程所需要的包java.net,就可以开始编写发送数据功能的方法代码2-1和接收数据功能的方法代码2-2。
代码2-2 接收数据报代码
接收方ds绑定端口号8000,并创建数据报dp,等待接收发送方发送的数据;发送方ds无需绑定固定端口号,但必须在创建数据报dp时,指定要发送到电脑的IP地址和端口号8000,通过代码2-1和2-2就可以实现简单的基于UDP协议的数据通信。
2.2 多线程技术
一般来说,当运行一个应用程序的时候,就启动了一个进程,有时会启动多个进程。启动进程的时候,操作系统会为进程分配资源,其中最主要的资源是内存空间。在进程中,有些程序流程块是可以乱序执行的,并且这个代码块可以同时被多次执行,这样的代码块就是线程体。线程是进程中乱序执行的代码流程,当多个线程同时运行的时候,这样的执行模式称为并发执行,多线程的目的是为了最大限度的利用CPU资源。
Java编写程序都运行在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每个正在系统上运行的程序都是一个进程,每个进程包含一到多个线程,进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行,也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务,通常由操作系统负责多个线程的调度和执行。Java语言中用多线程来同时为多个客户提供服务,这是提高服务器的并发性能的最常用手段。
在网络编程中,使用多线程可以把占据长时间的等待接收聊天信息的程序任务放到后台去处理,使程序的运行速度加快,提高CPU的利用率,在等待接收聊天信息的同时能够发送聊天信息给对方。
Java中用扩展Thread类或者实现Runnable接口两种方法来实现多线程,将发送数据端代码2-1和接收数据端代码2-2写在实现多线程的run方法中即可。run方法是多线程程序的一个约定,所有的多线程代码都在run方法里面。Thread类实际上也是实现了Runnable接口的类。在启动多线程的时候,需要先通过Thread类的构造方法Thread(Runnable target) 构造出对象,然后调用Thread对象的start()方法来运行多线程代码。实际上所有的多线程代码都是通过运行Thread的start()方法来运行的。因此,不管是扩展Thread类还是实现Runnable接口来实现多线程,最终还是通过Thread的对象来控制线程的。
本文介绍的DatagramSocket只允许数据报发往一个目的地,还可以使用java.net包中的类MulticastSocket。在发送数据报时使用MulticastSocket类,可以将数据报以广播方式发送到指定端口的所有客户。
网络特别是计算机网络的发展,越来越深刻的改变着人们生活的方方面面。当需要实时快速时,人们仅仅只需要简单的通讯,这时可以使用UDP协议来实现数据通信的功能。但是由于UDP协议的无连接,若需要安全可靠的数据通信时,就需要选择有连接的TCP协议来进行数据通信了。
总之,无论使用任何语言,任何方式实现数据通信,都必须遵循固定的步骤进行操作,在熟悉了这些步骤以后,可以根据需要进行逻辑上的处理,但还是必须以固定的步骤为前提。其实,实现基础的数据通信本身不难,也不需要很多的基础网络知识,编程的基础功能都已经由应用程序接口实现,只需要按照固定的步骤进行即可,例如使用Java提供的Socket接口和多线程技术,可方便高效的开发基于UDP或TCP的通信软件,实现网络间数据通信。
[1]孙卫琴 编著. JAVA网络编程精解[M].北京:电子工业出版社, 2007.2
[2]刘永华.于春花编著.Java网络编程技术[M].北京:清华大学出版社,2008.5
10.3969/j.issn.1001-8972.2012.09.054
茹志鹃、本科、讲师、计算机科学与技术。