基于UDP协议的网络编程(使用DatagramSocket发送接收数据)

一:UDP服务器端
package socketServer;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/***
* UDP 协议传输数据(服务器)
**/
public class UdpServer {
public static final int PORT = 30001;
// 定义每个数据报的最大大小为4K
public static final int DATA_LEN = 4096;
// 定义该服务器使用的DatagramSocket
private DatagramSocket socket = null;
// 定义接收网络数据的字节数组
byte[] inBuff = new byte[DATA_LEN];
// 以指定字节数组组建准备接受数据的DatagramPacket对象
private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length);
// 定义一个用于发送的DatagramPacket
private DatagramPacket outPacket;
// 定义一个字符串数组,服务器发送该数组的元素
String[] books = new String[] { "轻量级J2EE企业应用实战", "基于J2EE的Ajax宝典",
"Struts2权威指南", "ROR敏捷开发最佳实践" };
public void init() throws IOException {
try {
// 创建DatagramSocket 对象
socket = new DatagramSocket(PORT);
for (int i = 0; i < 1000; i++) {
// 读取Socket中的数据,读到的数据放在inPacket 所封装的字节数组里
socket.receive(inPacket);
// 判断inPacket.getData()和inBuff是否是同一个数组
System.out.println("---判断inPacket.getData()和inBuff是否是同一个数组 -----------" + inBuff == inPacket
.getData() + "--------------");
// 将接收到的内容转成字符串后输出
System.out.println("服务器端显示客户端输入的内容:"+new String(inBuff, 0, inPacket.getLength()));
// 从字符串数组中取出一个元素作为发送数据
byte[] sendData = books[i % 4].getBytes();
// 以指定字节数组作为发送数据,以刚接受到的DatagramPacket的源SocketAddress作为目标SocketAddress
// 创建DatagramPacket
outPacket = new DatagramPacket(sendData, sendData.length,
inPacket.getSocketAddress());
// 发送数据
socket.send(outPacket);
}
} catch (SocketException e) {
e.printStackTrace();
} finally {
if (socket != null) {
socket.close();
}
}
}
public static void main(String[] args) throws IOException {
new UdpServer().init();
}
}

二:UDP客户端
package socketClient;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
public class UdpClient {
/**
* UDP 协议传输数据(客户端)
*/
//定义发送数据报的目的地
public static final int DEST_PORT=30001;
public static final String DEST_IP="127.0.0.1";
private static final int DATA_LEN=4096;
//定义该客户端使用的DatagramSocket
private DatagramSocket socket=null;
//定义接收网络数据的字节数据
byte[] inBuff=new byte[DATA_LEN];
//以指定字节数组准备接受数据的DatagramPacket对象
private DatagramPacket inPacket=new DatagramPacket(inBuff,inBuff.length);
private DatagramPacket outPacket=null;

public void init() throws IOException{
try {
//使用随机端口
socket=new DatagramSocket();
//初始化发送用的DatagramPacket
outPacket=new DatagramPacket(new byte[0], 0,InetAddress.getByName(DEST_IP),DEST_PORT);
//键盘输入流
Scanner scan=new Scanner(System.in);
while(scan.hasNextLine()){
//将输入的一行字符串转换为字节数组
byte[] buff=scan.nextLine().getBytes();
//填充发送用的数据
outPacket.setData(buff);
// 发送数据报
socket.send(outPacket);
//读取socket中的数据,读到的数据放在inPacket所封装的字节数据里面
socket.receive(inPacket);
System.out.println("-------服务器返回的数据:"+new String(inBuff,0,inPacket.getLength())+"------");
}

} catch (SocketException e) {
e.printStackTrace();
}finally{
if(socket!=null){
socket.close();
}
}

}
public static void main(String[] args) throws IOException {
new UdpClient().init();
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值