基于UDP协议的数据交互例子

直接贴上代码:
客户端:

package com.example;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class UdpClient {

/** 定义发送数据报的目的地. */
public static final int DEST_PORT = 30000;

public static final String DEST_IP = "127.0.0.1";

/** 定义每个数据报的最大大小为4K */
private static final int DATA_LEN = 4096;

/** 定义该客户端使用的DatagramSocket,它的唯一作用就是接收和发送数据
报. */
private DatagramSocket mSocket = null;

/** 定义接收网络数据的字节数组 */
byte[] inBuff = new byte[DATA_LEN];

/** 以指定字节数组创建准备接受数据的DatagramPacket对象. Java使用
DatagramPacket来代表数据报. */
private DatagramPacket inPacket = new DatagramPacket(inBuff,
inBuff.length);

/** 定义一个用于发送的DatagramPacket对象 */
private DatagramPacket outPacket = null;

public void init() throws IOException {
try {
/**
* DatagramSocket():
* <p>
* 创建一个DatagramSocket实例,并将该对象绑定到
本机默认IP地址、本机所有可用端口中随机选择的
某个端口。
* <p>
* DatagramSocket(int prot):
* <p>
* 创建一个DatagramSocket实例,并将该对象绑定到
本机默认IP地址、指定端口。
* <p>
* DatagramSocket(int port, InetAddress
laddr):
* <p>
* 创建一个DatagramSocket实例,并将该对象绑定到
指定IP地址、指定端口。
*/
mSocket = new DatagramSocket();

/** 初始化发送用的DatagramSocket,它包含一个长度
为0的字节数组. */
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();

/** 设置发送用的DatagramPacket里的字节数据 */
outPacket.setData(buff);

/** 发送数据报 */
mSocket.send(outPacket);

/** 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里. */
mSocket.receive(inPacket);

System.out.println(new String(inBuff, 0, inPacket.getLength()));
}
}
/** 使用finally块保证关闭资源. */
finally {
if (mSocket != null) {
mSocket.close();
}
}
}

public static void main(String[] args) throws IOException {
new UdpClient().init();
}
}



服务器端:

package com.example;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpServer {

public static final int PORT = 30000;

/** 定义每个数据报的最大大小为4K. */
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);

/** 定义一个用于发送的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 < 10; i++) {
/** 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里. */
socket.receive(inPacket);

/** 判断inPacket.getData()和inBuff是否是同一个数组. */
System.out.println(inBuff == inPacket.getData());

/** 将接收到的内容转成字符串后输出. */
System.out.println(new String(inBuff, 0, inPacket.getLength()));

/** 从字符串数组中取出一个元素作为发送的数据. */
byte[] sendData = books[i % 4].getBytes();

/**
* 以指定字节数组作为发送数据、以刚接受到的DatagramPacket的源
* <p>
* SocketAddress作为目标SocketAddress创建DatagramPacket.
*/
outPacket = new DatagramPacket(sendData, sendData.length, inPacket.getSocketAddress());

/** 发送数据. */
socket.send(outPacket);
}
}
/** 使用finally块保证关闭资源. */
finally {
if (socket != null) {
socket.close();
}
}
}

public static void main(String[] args) throws IOException {
new UdpServer().init();
}
}



最后说一句:此时服务器端的循环只有10次,在接受了10次数据后,Server端就不能接受到数据了.这个要注意一下.更详细点得描述,可以浏览这个地址:
[url]http://hxdawxyhxdawxy.iteye.com/blog/1291266[/url]

总结一下:
客户端与服务器端的唯一区别在于:服务器所在IP地址、端口是固定的,所以客户端可以直接将该数据报发送给服务器,而服务器则需要根据接收到的数据报来决定将"反馈"数据报的目的地.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值