全屏

12.3.5 UDP通讯的实现


【专业IT培训机构,真正零首付入学www.bjsxt.com


▪ DatagramSocket:用于发送或接收数据报包

      当服务器要向客户端发送数据时,需要在服务器端产生一个DatagramSocket对象,在客户端产生一个DatagramSocket对象。服务器端的DatagramSocket将DatagramPacket发送到网络上,然后被客户端的DatagramSocket接收。

      DatagramSocket有两种常用的构造函数。一种是无需任何参数的,常用于客户端;另一种需要指定端口,常用于服务器端。如下所示:

      DatagramSocket() :构造数据报套接字并将其绑定到本地主机上任何可用的端口。

      DatagramSocket(int port) :创建数据报套接字并将其绑定到本地主机上的指定端口。

常用方法:

      Ø send(DatagramPacket p) :从此套接字发送数据报包。

      Ø receive(DatagramPacket p) :从此套接字接收数据报包。

      Ø close() :关闭此数据报套接字。

▪ DatagramPacket:数据容器(封包)的作用

      此类表示数据报包。 数据报包用来实现封包的功能。

常用方法:

      Ø DatagramPacket(byte[] buf, int length) :构造数据报包,用来接收长度为 length 的数据包。

      Ø DatagramPacket(byte[] buf, int length, InetAddress address, int port) :构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

      Ø getAddress() :获取发送或接收方计算机的IP地址,此数据报将要发往该机器或者是从该机器接收到的。

      Ø getData() :获取发送或接收的数据。

      Ø setData(byte[] buf) :设置发送的数据。

UDP通信编程基本步骤:

      1. 创建客户端的DatagramSocket,创建时,定义客户端的监听端口。

      2. 创建服务器端的DatagramSocket,创建时,定义服务器端的监听端口。

      3. 在服务器端定义DatagramPacket对象,封装待发送的数据包。

      4. 客户端将数据报包发送出去。

      5. 服务器端接收数据报包。

【示例12-13】UDP:单向通信之客户端

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class Client {
	public static void main(String[] args) throws Exception {
		byte[] b = "北京尚学堂".getBytes();
		//必须告诉数据报包要发到哪台计算机的哪个端口,发送的数据以及数据的长度
		DatagramPacket dp = new DatagramPacket(b,b.length,new 
InetSocketAddress("localhost",8999));
		//创建数据报套接字:指定发送信息的端口
		DatagramSocket ds = new DatagramSocket(9000);
		//发送数据报包
		ds.send(dp);
		//关闭资源
		ds.close();
	}
}

【示例12-14】UDP:单向通信之服务器端

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Server {
	public static void main(String[] args) throws Exception {
		//创建数据报套接字:指定接收信息的端口
		DatagramSocket ds = new DatagramSocket(8999);
		byte[] b = new byte[1024];
		//创建数据报包,指定要接收的数据的缓存位置和长度
		DatagramPacket dp = new DatagramPacket(b, b.length);
		//接收客户端发送的数据报
		ds.receive(dp); // 阻塞式方法
		//dp.getLength()返回实际收到的数据的字节数
		String string = new String(dp.getData(), 0, dp.getLength());
		System.out.println(string);
		//关闭资源
		ds.close();
	}
}

      执行结果如图12-11所示:

图12-11 示例12-13与12-14运行效果图.png

图12-11 示例12-13与12-14运行效果图

      通过字节数组流ByteArrayInputStream、ByteArrayOutputStream与数据流DataInputStream、DataOutputStream联合使用可以传递基本数据类型。

【示例12-15】UDP:基本数据类型的传递之客户端

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class Client {
	public static void main(String[] args) throws Exception {
		long n = 2000L;
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		DataOutputStream dos = new DataOutputStream(bos);
		dos.writeLong(n);
		//获取字节数组流中的字节数组(我们要发送的数据)
		byte[] b = bos.toByteArray();
		//必须告诉数据报包要发到哪台计算机的哪个端口,发送的数据以及数据的长度
		DatagramPacket dp = new DatagramPacket(b,b.length,new   
                                             InetSocketAddress("localhost",8999));
		//创建数据报套接字:指定发送信息的端口
		DatagramSocket ds = new DatagramSocket(9000);
		//发送数据报包
		ds.send(dp);
		//关闭资源
		dos.close();
		bos.close();
		ds.close();
	}
}

【示例12-16】UDP:基本数据类型的传递之服务器端

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Server {
	public static void main(String[] args) throws Exception {
		//创建数据报套接字:指定接收信息的端口
		DatagramSocket ds = new DatagramSocket(8999);
		byte[] b = new byte[1024];
		//创建数据报包,指定要接收的数据的缓存位置和长度
		DatagramPacket dp = new DatagramPacket(b, b.length);
		//接收客户端发送的数据报
		ds.receive(dp); // 阻塞式方法
		//dp.getData():获取客户端发送的数据,返回值是一个字节数组
		ByteArrayInputStream bis = new ByteArrayInputStream(dp.getData());
		DataInputStream dis = new DataInputStream(bis);
		System.out.println(dis.readLong());
		//关闭资源
		dis.close();
		bis.close();
		ds.close();
	}
}

      执行结果如图12-12所示:

图12-12 示例12-15与12-16运行效果图.png

图12-12 示例12-15与12-16运行效果图

      通过字节数组流ByteArrayInputStream、ByteArrayOutputStream与数据流ObjectInputStream、ObjectOutputStream联合使用可以传递对象。

【示例12-17】UDP:对象的传递之Person类

import java.io.Serializable;
public class Person implements Serializable{
	private static final long serialVersionUID = 1L;
	int age;
	String name;
	public Person(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}
	@Override
	public String toString() {
		return "Person [age=" + age + ", name=" + name + "]";
	}
}

【示例12-18】UDP:对象的传递之客户端

import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class Client {
	public static void main(String[] args) throws Exception {
		//创建要发送的对象
		Person person = new Person(18, "高淇");
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(bos);
		oos.writeObject(person);
		//获取字节数组流中的字节数组(我们要发送的数据)
		byte[] b = bos.toByteArray();
		//必须告诉数据报包要发到哪台计算机的哪个端口,发送的数据以及数据的长度
		DatagramPacket dp = new DatagramPacket(b,b.length,new 
                                             InetSocketAddress("localhost",8999));
		//创建数据报套接字:指定发送信息的端口
		DatagramSocket ds = new DatagramSocket(9000);
		//发送数据报包
		ds.send(dp);
		//关闭资源
		oos.close();
		bos.close();
		ds.close();
	}
}	

【示例12-19】UDP:对象的传递之服务器端

import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Server {
	public static void main(String[] args) throws Exception {
		//创建数据报套接字:指定接收信息的端口
		DatagramSocket ds = new DatagramSocket(8999);
		byte[] b = new byte[1024];
		//创建数据报包,指定要接收的数据的缓存位置和长度
		DatagramPacket dp = new DatagramPacket(b, b.length);
		//接收客户端发送的数据报
		ds.receive(dp); // 阻塞式方法
		//dp.getData():获取客户端发送的数据,返回值是一个字节数组
		ByteArrayInputStream bis = new ByteArrayInputStream(dp.getData());
		ObjectInputStream ois = new ObjectInputStream(bis);
		System.out.println(ois.readObject());
		//关闭资源
		ois.close();
		bis.close();
		ds.close();
	}
}

      执行结果如图12-13所示:

图12-13 示例12-17~示例12-19运行效果图.png

图12-13 示例12-17~示例12-19运行效果图

分类导航
点击按住视频可拖动

缩小

关闭

  • 正在学习
  • 北京总部地址:北京市海淀区西三旗街道建材城西路中腾建华商务大厦东侧二层尚学堂
  • 咨询电话:400-009-1906 010-56233821
  • Copyright 2007-2015 北京尚学堂科技有限公司
  • 京ICP备13018289号-1 京公网安备11010802015183