Java编程--网络编程(UDP)

Java编程--网络编程(UDP)

 一. UDP协议发送数据:

 1)创建发送端socket对象

 2)创建数据并把数据打包

 3)调用socket对象的发送方法发送数据包

 4)释放资源

与UDP发送端有关的方法:

java.net
类 DatagramSocket

java.lang.Object

  java.net.DatagramSocket

此类表示用来发送和接收数据报包的套接字。

java.net
类 DatagramPacket

java.lang.Object

  java.net.DatagramPacket

此类表示数据报包。

public void send(DatagramPacket p)

从此套接字发送数据报包。DatagramPacket 包含的信息指示:将要发送的数据、其长度远程主机的 IP 地址远程主机的端口号。

public DatagramPacket(byte[] buf,int length,InetAddress address,int port)

构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。length 参数必须小于等于 buf.length

参数: 

buf - 包数据。

length - 包长度。

address - 目的地址。

port - 目的端口号。

【案例】编写UDP发送端。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
 * 	UDP协议发送数据:
 * 	(1)创建发送端socket对象
 * 	(2)创建数据并把数据打包
 * 	(3)调用socket对象的发送方法发送数据包
 * 	(4)释放资源
 * */
public class SendDemo {
	public static void main(String[] args) throws IOException {
	    //(1)创建发送端socket对象
		// DatagramSocket():构造数据报套接字并将其绑定到本地主机上任何可用的端口。
		DatagramSocket ds = new DatagramSocket();
		
		//(2)创建数据并把数据打包
		// public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
		// 1-创建数据
		byte[] bys = "hello UDP,我来了".getBytes();
		// 2-长度
		int len = bys.length;
		// 3-IP地址
		InetAddress address = InetAddress.getByName("192.168.80.1");
		// 4-端口
		int port = 10086;
		DatagramPacket dp = new DatagramPacket(bys,len,address,port);
		
		//(3)调用socket对象的发送方法发送数据包
		ds.send(dp);
		
		//(4)释放资源
		ds.close();
	}
}

 二. UDP协议接收数据:

1)创建发送端socket对象需要指定端口

2)创建一个数据包(接收容器) 

3)调用socket对象的接收方法接收数据

4)解析数据并显示在控制台

5)释放资源

与UDP接收端相关的方法:

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

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

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

public byte[] getData()返回数据缓冲区。

public int getLength()返回将要发送或接收到的数据的长度。

public InetAddress getAddress()返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 

【案例】编写UDP接收端。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
 *  UDP协议接收数据:
	(1)创建发送端socket对象
	(2)创建一个数据包(接收容器) 
	(3)调用socket对象的接收方法接收数据
	(4)解析数据并显示在控制台
	(5)释放资源
*/
public class ReceiveDemo {

	public static void main(String[] args) throws IOException {
		// (1)创建发送端socket对象
		// public DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。
		DatagramSocket ds = new DatagramSocket(10086);

		// (2)创建一个数据包(接收容器)
		// DatagramPacket(byte[] buf, int length):构造DatagramPacket,用来接收长度为
		// length 的数据包。
		byte[] bys = new byte[1024];
		int len = bys.length;

		DatagramPacket dp = new DatagramPacket(bys, len);

		// (3)调用socket对象的接收方法接收数据
		// public void receive(DatagramPacket p):从此套接字接收数据报包。
		ds.receive(dp);

		// (4)解析数据并显示在控制台
		// 获取对方的IP
		// public InetAddress getAddress():返回某台机器的 IP地址,此数据报将要发往该机器或者是从该机器接收到的。
		InetAddress address = dp.getAddress();
		String ip = address.getHostAddress();

		// public byte[] getData():返回数据缓冲区。
		// public int getLength():返回将要发送或接收到的数据的长度。
		byte[] bys2 = dp.getData();
		int len2 = dp.getLength();
		String s = new String(bys2, 0, len2);
		System.out.println(ip + ":" + s);

		// (5)释放资源
		ds.close();
	}
}

代码优化:

【接收端】

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveDemo {
	public static void main(String[] args) throws IOException {
		// 创建接收端的socket对象
		DatagramSocket ds = new DatagramSocket(12345);

		// 创建一个包裹
		byte[] bys = new byte[1024];
		DatagramPacket dp = new DatagramPacket(bys, bys.length);

		// 接收数据
		ds.receive(dp);

		// 解析数据
		String ip = dp.getAddress().getHostAddress();
		String s = new String(dp.getData(), 0, dp.getLength());
		System.out.println("form " + ip + ":" + s);

		// 释放资源
		ds.close();
	}
}
【发送端】
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendDemo {
	public static void main(String[] args) throws IOException{
		// 创建一个socket对象
		DatagramSocket ds = new DatagramSocket();
		// 创建数据并打包
		byte[] bys = "hello world".getBytes();
		DatagramPacket dp = new DatagramPacket(bys, bys.length, 
				InetAddress.getByName("192.168.80.1"), 12345);
		// 发送数据
		ds.send(dp);
		
		// 释放资源
		ds.close();
	}
}

【案例】数据来自于键盘录入,当用户输入“886”终止。

接收端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveDemo {
	public static void main(String[] args) throws IOException {
		// 创建接收端的socket对象
		DatagramSocket ds = new DatagramSocket(12345);

		while (true) {
			// 创建一个包裹
			byte[] bys = new byte[1024];
			DatagramPacket dp = new DatagramPacket(bys, bys.length);

			// 接收数据
			ds.receive(dp);

			// 解析数据
			String ip = dp.getAddress().getHostAddress();
			String s = new String(dp.getData(), 0, dp.getLength());
			System.out.println("form " + ip + ":" + s);
		}
		// 接收端应该一直开着接收数据,不需要关闭
		// 释放资源
		// ds.close();

	}
}

发送端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendDemo {
	public static void main(String[] args) throws IOException {
		// 创建一个socket对象
		DatagramSocket ds = new DatagramSocket();
		// 创建数据并打包
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line = null;
		while ((line = br.readLine()) != null) {
			if ("886".equals(line)) {
				break;
			}
			byte[] bys = line.getBytes();
			DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.80.1"), 12345);
			// 发送数据
			ds.send(dp);
		}

		// 释放资源
		ds.close();
	}
}

你可能感兴趣的:(Java,Java编程)