用户数据协议(UDP)是网络信息传输的另外一种形式, 基于UDP的通信不同于基于TCP的通信, 基于UDP的信息传递更快, 但是不提供可靠的保证. 使用UDP传输数据时, 用户无法知道数据能否正确地到达主机, 也不能确定到达目的地的顺序是否和发送的顺序相同. 虽然, UDP是一种不可靠的协议, 但如果需要较快地传输信息, 并能够容忍较小的错误, 可以考虑使用UDP.

  基于UDP通信的基本模式如下:

    1. 将数据打包(称为数据包), 然后将数据包发往目的地.

    2. 接收别人发来的数据包, 然后查看数据包.

  UDP程序步骤:

  发送数据包:

    1. 使用 DatagramSocket()创建一个数据包套接字.

    2. 使用 DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)创建要发送的数据包.

    3. 使用 DatagramSocket类的 send()方法发送数据包.

  接收数据包:

    1. 使用 DatagramSocket(int port)创建数据包套接字, 绑定到指定端口.

    2. 使用 DatagramPacket(byte[] buf, int length)创建字节数组来接收数据包.

    3. 使用 DatagramPacket类的 receive()方法接收UDP包.

Demo_1:

Server 端:

import java.io.IOException;
import java.net.*;
public class TestUDPServer {
	public static void main(String[] args) {
		byte buf[] = new byte[1024];
		try {
			DatagramSocket ds = new DatagramSocket(5678);
			DatagramPacket dp = new DatagramPacket(buf, buf.length);
			while(true){
				try {
					ds.receive(dp);
					System.out.println(new String(buf,0,dp.getLength()));
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}
}

 Client 端:

import java.io.IOException;
import java.net.*;
public class TestUDPClient {
	public static void main(String[] args) {
		byte[] buf = (new String("hello java")).getBytes();
		DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress("192.168.56.1", 5678));
		DatagramSocket ds;
		try {
			ds = new DatagramSocket(9999);
			try {
				ds.send(dp);
			} catch (IOException e) {
				e.printStackTrace();
			}
			ds.close();
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}
}

 运行结果:

Demo_2:

Server 端:

import java.io.*;
import java.net.*;
public class UDPServer {
	public static void main(String[] args) {
		byte[] buf = new byte[1028];
		try {
			DatagramSocket ds = new DatagramSocket(5679);
			DatagramPacket dp = new DatagramPacket(buf, buf.length);
			while(true){
				try {
					ds.receive(dp);
					ByteArrayInputStream bais = new ByteArrayInputStream(buf);
					DataInputStream dis = new DataInputStream(bais);
					System.out.println(dis.readLong());
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}
}

 Client 端:

import java.io.*;
import java.net.*;
public class UDPClient {
	public static void main(String[] args) {
		long n = 1089L;
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		DataOutputStream dos = new DataOutputStream(baos);
		try {
			dos.writeLong(n);
			byte[] buf = baos.toByteArray();
			DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress("192.168.56.1", 5679));
			DatagramSocket ds = new DatagramSocket(9987);
			ds.send(dp);
			ds.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 运行结果:

posted on 2017-06-19 21:01  牧羊人的世界  阅读(182)  评论(0编辑  收藏  举报