UDP通信

UDP通信

  1. 构建接收包

    DatagramPacket:
    1、构造接收包

-DatagramPacket(byte[] buf,int length)
将数据包中的length长的数据装进buf的数组中
-DatagramPacket(byte[] buf,int offset,int length)
将数据包中从offset开始,length长的数据装进buf的数组中

2、构建发送包

-DatagramPacket(byte[] buf,int length,InetAddress clientAddress,int clientPort)
从buf数组中,取出length长度的数据创建数据包对象,目标是clientAddress地址,clientPort端口,通常用来发送数据给客户端

3、服务端接收
DataSocket
用于接收和发送UDP的Socket实例,

-DatagramSocket(int port)
创建实例,并固定监听port端口的报文。通常用于服务端.
receive(DatagramPacket d)
接收数据报文到d中,receive方法产生阻塞。

4、客户端发送
DatagramSocket
用于接收和发送UDP的Socket实例
无参的构造方法DatagramSocket()
通常用于客户端编程,它并没有特定的监听端口,仅仅使用一个临时的。程序会让操作系统分配一个可用的端口
send(DatagramPacket dp)
该方法用来发送报文dp到目的地
UDP通信实例

client类:

向服务端发送数据的步奏:
1创建好Socket(一次就行)
2准备数据
3创建数据包
4将数据存入包中(3,4是一步完成)
5将数据包通过Socket发送给服务端

package day06.udp;

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

/**
 * 客户端
 * @author Administrator
 *
 */
public class Client {
	/**
	 * 客户端的启动方法
	 */
	public void start(){
		try{
			/**
			 * 向服务端发送数据的步奏:
			 * 1创建好Socket(一次就行)
			 * 2准备数据
			 * 3创建数据包
			 * 4将数据存入包中(3,4是一步完成)
			 * 5将数据包通过Socket发送给服务端
			 */
			
			//创建Socket
			DatagramSocket socket
				=new DatagramSocket();
			String str="你好!服务端";
			byte[]  data=str.getBytes("utf-8");
			
			//打包:准备包裹,填写地址,装入数据
			
			InetAddress address=InetAddress.getByName("localhost");
			//定义端口号
			int port=8088;
			//构建发送包
			DatagramPacket sendPacket
				=new DatagramPacket(
						data,//数组
						data.length,//长度
						address,//地址
						port//端口号
					);
			//将包发出去
			socket.send(sendPacket);
			
			/**
			 * 接收服务端发回的信息
			 */
			
			
			DatagramPacket recvPacket=new DatagramPacket(
					 data,
					 data.length
					
					);
			//接收数据到包中
			//注意,该方法是个阻塞方法。
					socket.receive(recvPacket);
					
			//拆包拿数据
				byte[] d=recvPacket.getData();
				//有效数据的长度
				int dlen=recvPacket.getLength();
				/**
				 * String(byte[] b,
				 * int offset,
				 * int len,
				 * String charsetName)
				 * 
				 * 将给定的字节数组中,从offset处开始
				 * 到len个字节,再根据给定的字符集
				 * 准换为字符串
				 */
				String info=new String(d,0,dlen,"utf-8");
				
				System.out.println("服务端说:"+info);
			
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args){
		Client client=new Client();
		client.start();
	}
}

server类:

*** 接收包的步奏:**
1创建Socket
2创建一个合适大小的包
3通过socket接收数据到包中
4拆包取数据

package day06.udp;

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

/**
 * 服务端
 * @author Administrator
 *
 */
public class Server {
	/**
	 * 服务端的启动方法
	 */
	public void start(){
		try{
			/**
			 * 接收包的步奏:
			 * 1创建Socket
			 * 2创建一个合适大小的包
			 * 3通过socket接收数据到包中
			 * 4拆包取数据
			 */
			DatagramSocket socket
				=new DatagramSocket(8088);
			
			byte[] data=new byte[100];
			DatagramPacket recvPacket=new DatagramPacket(
					 data,
					 data.length
					
					);
			//接收数据到包中
			//注意,该方法是个阻塞方法。
					socket.receive(recvPacket);
					
			//拆包拿数据
				byte[] d=recvPacket.getData();
				//有效数据的长度
				int dlen=recvPacket.getLength();
				/**
				 * String(byte[] b,
				 * int offset,
				 * int len,
				 * String charsetName)
				 * 
				 * 将给定的字节数组中,从offset处开始
				 * 到len个字节,再根据给定的字符集
				 * 准换为字符串
				 */
				String info=new String(d,0,dlen,"utf-8");
				
				System.out.println("客户端说:"+info);
				
				//回复客户端的信息
				String str="你好,客户端!";
				data=str.getBytes("utf-8");
				
				InetAddress address=
						recvPacket.getAddress();
				int port=recvPacket.getPort();
				//构建发送包
				DatagramPacket sendPacket
					=new DatagramPacket(
							data,//数组
							data.length,//长度
							address,//地址
							port//端口号
						);
				//将包发出去
				socket.send(sendPacket);
			
		}catch(Exception e){
			e.printStackTrace();
			
		}
	}
	public static void main(String[] args){
		Server server=new Server();
		server.start();
	}
}

测试:
客户端输出消息
这里写图片描述

服务端输出消息
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值