DatagramPaeket则用来表示一个数据报,它是传输数据的载体,封装了数据、数据长度、数据报地址等信息。采用UDP套接字方式实现C/s的通信程序由客户端和服务器端两部分组成。服务器进程依次按以下步骤进行:1)调用Socket0创建一个数据报套接字;2)调用bind0把服务器地址绑定在该套接字上;3)调用recvform0等待客户进程发来的请求,服务器此时处于无限循环状态;4)服务进程接收到客户进程所发来的数据报后,进行处理,调用sendt00将处理结果返回给客户进程,返回状态31.继续监听;5)服务进程调用close0撤消套接字,终止服务。客户进程则按以下步骤进行:1)调用Socket 0创建一个数据流套接字;2)调用sendto 0向服务器进程发送数据报;3)调用reevfrom0等待服务器进程返同该处理结果;4)客户进程凋用closeO撤消套接字。
以下是基于UDP的Socket网络通信实例代码:
1:建立一个UDP类
package com.lcq.network; /** * * 类名:UdpTest1 * 功能:建立DatagramSocket类,通过发送和接收数据报包来实现网络通信 * 时间: * 作者:lcq * 版本: * */ import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UdpTest1 { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { //DatagramSocket此类表示用来发送和接收数据报包的套接字。 DatagramSocket ds = new DatagramSocket(); String str = "Hello World"; //DatagramPacket此类表示数据报包。 DatagramPacket dp = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("localhost"), 7000); //发送数据报 ds.send(dp); byte[] by = new byte[1000]; // 构造 DatagramPacket,用来接收长度为 length 的数据包。 DatagramPacket dp2 = new DatagramPacket(by,100); ds.receive(dp2); System.out.println(new String(by,0,dp2.getLength())); ds.close(); } }
2:在建立一个UDP类
package com.lcq.network; /** * * 类名:UdpTest2 * 功能:建立DatagramSocket类,通过发送和接收数据报包来实现网络通信 * 时间: * 作者:lcq * 版本: * */ import java.net.DatagramPacket; import java.net.DatagramSocket; public class UdpTest2 { public static void main(String[] args) throws Exception { //DatagramSocket此类表示用来发送和接收数据报包的套接字。 DatagramSocket ds = new DatagramSocket(7000); byte[] by = new byte[1000]; // 构造 DatagramPacket,用来接收长度为 length 的数据包。 DatagramPacket dp = new DatagramPacket(by,1000); ds.receive(dp); System.out.println(new String(by,0,dp.getLength())); String str = "welcome"; //DatagramPacket此类表示数据报包。 dp.getAddress()得到接收到的DatagramPacket的主机的地址 DatagramPacket dp2 = new DatagramPacket(str.getBytes(), str.length(), dp.getAddress(), dp.getPort()); //发送数据报 ds.send(dp2); ds.close(); } }
运行时先启动第二个类,再启动第一个类。实现了两个对象的通信。