UDP通信
- 构建接收包
–
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();
}
}
测试:
客户端输出消息
服务端输出消息