一 . 简介
- UDP协议(用户数据报协议)将数据及源和目的封装成数据包,不需要建立连接。
- UDP协议以数据报作为数据传输的载体,每个数据报大小限制在64K以内
- 使用UDP进行数据传输时,首先需要将要传输的数据定义成数据报(Datagram),在数据报中指明所要达到的Socket(主机地址和端口号),然后在将数据报发生出去。
- 因为无连接,所以该协议速度很快,同时也导致这是一个不可靠协议
二. 相关操作类
1. DatagramPacket:表示数据报包
构造方法:
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
//构造数据报包,用来将长度为 length 的包---发送---到指定主机上的指定端口号。
DatagramPacket(byte[] buf, int length)
//构造 DatagramPacket,用来---接收---长度为 length 的数据包。
常用方法:
InetAddress getAddress()
返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
byte[] getData()
返回数据缓冲区。
int getLength()
返回将要发送或接收到的数据的长度。
int getPort()
返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。
2. DatagramSocket:进行端到端通信的类
void receive(DatagramPacket p)
从此套接字接收数据报包。
void send(DatagramPacket p)
从此套接字发送数据报包。
//根据客户端发送过来的socket,服务端可以进行获取该客户端的相关信息
InetAddress getInetAddress()
返回此套接字连接的地址
int getPort()
返回此套接字的端口
三. 简单聊天工具
import java.io.*;
import java.net.*;
import java.util.*;
import java.text.*;
class Send implements Runnable
{
//1..创建Socket服务(系统随机分配,不需指定端口)
private DatagramSocket ds;
Send(DatagramSocket ds)
{
this.ds = ds;
}
public void run()
{
try
{
//键盘录入聊天内容
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=bufr.readLine())!=null)
{
//2..创建数据报,将数据封装
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(),10002);
//3..发送数据报
ds.send(dp);
if("over".equals(line))
break;
}
}
catch (Exception e)
{
throw new RuntimeException("发送端异常");
}
}
}
class Rece implements Runnable
{
//1..创建Socket服务(指定端口)
private DatagramSocket ds;
public Rece(DatagramSocket ds)
{
this.ds = ds;
}
public void run()
{
try
{
while(true)
{
//2..创建数据报,用于接收数据
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//3..接收数据
ds.receive(dp); //此方法在接收到数据报之前会一直阻塞
//4..处理数据
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
if("over".equals(data))
{
System.out.println(ip+"下线");
break;
}
Date d = new Date();
DateFormat df = new SimpleDateFormat("HH:mm:ss");
System.out.println(ip+" "+df.format(d)+"\n"+data);
}
}
catch (Exception e)
{
throw new RuntimeException("接收端异常");
}
}
}
class ChatTest
{
public static void main(String[] args) throws Exception
{
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receSocket = new DatagramSocket(10000);
new Thread(new Send(sendSocket)).start();
new Thread(new Rece(receSocket)).start();
}
}