--------------------------------------------------java中UDP协议的开发步骤------------------------------------------------------
Socket是网络编程提供的一种机制,通信的两端都要有socket,
网络通信其实就是socket间的通信,数据在两个socket间的io流上通信。
UDP通信
UDP服务端的步骤
1. 创建socket服务对象
UDP的服务端的构造器
|
DatagramSocket() |
protected |
DatagramSocket(DatagramSocketImpl impl) |
|
DatagramSocket(int port) |
|
DatagramSocket(int port, InetAddress laddr) |
|
DatagramSocket(SocketAddress bindaddr) |
2.接收数据:使用数据包的方式来接收,用到了Datagrampacket此类表示数据包。
DatagramPacket(byte[] buf, int length) |
DatagramPacket(byte[] buf, int length, InetAddress address, int port) |
DatagramPacket(byte[] buf, int offset, int length) |
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) |
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) |
DatagramPacket(byte[] buf, int length, SocketAddress address) |
代码示例:
/**
* 服务端
* @author李昆鹏
*
*/
public class UDPServer {
public static void main(String[] args) {
DatagramSocket ds = null;
try {
//创建UDP服务端的对象,必须指定端口
//端口最好指定在一万以上,因为八千之前的端口很多都被占用了
ds = new DatagramSocket(10000);
//定义接收的字节数组
byte[] bs = new byte[1024];
System.out.println("服务器已经启动");
while(true) {
//定义接收数据包
DatagramPacket dp = new DatagramPacket(bs, bs.length);
//数据包的接收
ds.receive(dp);
//获得发生端的IP
InetAddress ia = dp.getAddress();
//获得数据包中的数据,这个数组的长度是我们自己定义的长度(1024)
byte[] bs1 = dp.getData();
//或得接收数据的长度(实际接收到数据的长度)
int len = dp.getLength();
//组装接收到的数据
String data = new String(bs1,0,len);
//退出程序
if("exit".equals(data)) {
System.out.println("服务端已退出");
break;
}
System.out.println(ia.getHostAddress()+"发送了"+data);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭服务端
if(ds != null)
ds.close();
}
}
}
---------------------------------------------------------------------------------
/**
* 客服端
* @author李昆鹏
*
*/
public class UDPClient {
public static void main(String[] args) {
DatagramSocket ds = null;
BufferedReader br = null;
try {
//创建控制台的输入流对象
br = new BufferedReader(new InputStreamReader(System.in));
//创建客服端端接收对象
ds = new DatagramSocket();
System.out.println("客服端已启动");
while (true) {
System.out.println("请输入你要发送的内容:");
//读取控制台输入的数据并且转换成字节数组
byte[] bs = br.readLine().getBytes();
//创建要发送的目的地的IP对象
InetAddress ia = InetAddress.getByName("192.168.1.104");
//指定数据包
//第一个参数是打包的字节数组,第二个参数是要打包的字节长度
//第三个参数是要发送的IP对象,第四个参数是要发送的服务端
DatagramPacket dp = new DatagramPacket(bs, bs.length,ia,10000);
//发送
ds.send(dp);
//退出程序
if("exit".equals(new String(bs,0,bs.length)))
System.out.println("客服端已退出");
break;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(ds != null)
ds.close();
try {
if( br != null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}