package handler;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.*;
/**
* UDP客户端和服务端测试案例
* Created by Administrator on 2016-11-25.
*/
public class UDPTest {
public static void main(String[] args) throws IOException {
client();
}
/**
* UDP客户端发送数据,和接收服务端返回的数据
* @throws IOException
*/
public static void client() throws IOException {
int TIMEOUT = 5000; //设置接收数据的超时时间
int MAXNUM = 5; //设置重发数据的最多次数
String str_send = "Hello this client";
byte[] buf = new byte[1024];
//客户端在9000端口监听接收到的数据
DatagramSocket ds = new DatagramSocket(9000);
InetAddress loc = InetAddress.getByName("10.0.0.1");
//定义用来发送数据的DatagramPacket实例 参数:信息byte[],信息长度,服务端IP,服务端监听端口
DatagramPacket dp_send= new DatagramPacket(str_send.getBytes(),str_send.length(),loc,10006);
//定义用来接收数据的DatagramPacket实例
DatagramPacket dp_receive = new DatagramPacket(buf, 1024);
ds.setSoTimeout(TIMEOUT); //设置接收数据时阻塞的最长时间
int tries = 0; //重发数据的次数
boolean receivedResponse = false; //是否接收到数据的标志位
//直到接收到数据,或者重发次数达到预定值,则退出循环
while(!receivedResponse && tries<MAXNUM){
//发送数据
ds.send(dp_send);
try{
System.out.println("发送数据成功");
//接收从服务端发送回来的数据
ds.receive(dp_receive);
//如果接收到的数据不是来自目标地址,则抛出异常
if(!dp_receive.getAddress().equals(loc)){
throw new IOException("Received packet from an umknown source");
}
//如果接收到数据。则将receivedResponse标志位改为true,从而退出循环
receivedResponse = true;
}catch(InterruptedIOException e){
//如果接收数据时阻塞超时,重发并减少一次重发的次数
tries += 1;
System.out.println("Time out," + (MAXNUM - tries) + " more tries..." );
}
}
if(receivedResponse){
//如果收到数据,则打印出来
String str_receive = new String(dp_receive.getData(),0,dp_receive.getLength()) +
" from " + dp_receive.getAddress().getHostAddress() + ":" + dp_receive.getPort();
System.out.println(str_receive);
//由于dp_receive在接收了数据之后,其内部消息长度值会变为实际接收的消息的字节数,
//所以这里要将dp_receive的内部消息长度重新置为1024
dp_receive.setLength(1024);
}else{
//如果重发MAXNUM次数据后,仍未获得服务器发送回来的数据,则打印如下信息
System.out.println("No response -- give up.");
}
ds.close();
}
/**
* UDP服务端接收数据,和返回数据到客户端
* @throws IOException
*/
public static void server() throws IOException {
String str_send = "Hello world";
byte[] buf = new byte[1024];
//服务端在10006端口监听接收到的数据
DatagramSocket ds = new DatagramSocket(10006);
//接收从客户端发送过来的数据
DatagramPacket dp_receive = new DatagramPacket(buf, 1024);
boolean f = true;
while(f){
//服务器端接收来自客户端的数据
ds.receive(dp_receive);
System.out.println("server received data from client:");
String str_receive = new String(dp_receive.getData(),0,dp_receive.getLength()) +
" from " + dp_receive.getAddress().getHostAddress() + ":" + dp_receive.getPort();
System.out.println(str_receive);
//数据发动到客户端的3000端口
DatagramPacket dp_send= new DatagramPacket(str_send.getBytes(),str_send.length(),dp_receive.getAddress(),9000);
ds.send(dp_send);
//由于dp_receive在接收了数据之后,其内部消息长度值会变为实际接收的消息的字节数,
//所以这里要将dp_receive的内部消息长度重新置为1024
dp_receive.setLength(1024);
}
ds.close();
}
}
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.*;
/**
* UDP客户端和服务端测试案例
* Created by Administrator on 2016-11-25.
*/
public class UDPTest {
public static void main(String[] args) throws IOException {
client();
}
/**
* UDP客户端发送数据,和接收服务端返回的数据
* @throws IOException
*/
public static void client() throws IOException {
int TIMEOUT = 5000; //设置接收数据的超时时间
int MAXNUM = 5; //设置重发数据的最多次数
String str_send = "Hello this client";
byte[] buf = new byte[1024];
//客户端在9000端口监听接收到的数据
DatagramSocket ds = new DatagramSocket(9000);
InetAddress loc = InetAddress.getByName("10.0.0.1");
//定义用来发送数据的DatagramPacket实例 参数:信息byte[],信息长度,服务端IP,服务端监听端口
DatagramPacket dp_send= new DatagramPacket(str_send.getBytes(),str_send.length(),loc,10006);
//定义用来接收数据的DatagramPacket实例
DatagramPacket dp_receive = new DatagramPacket(buf, 1024);
ds.setSoTimeout(TIMEOUT); //设置接收数据时阻塞的最长时间
int tries = 0; //重发数据的次数
boolean receivedResponse = false; //是否接收到数据的标志位
//直到接收到数据,或者重发次数达到预定值,则退出循环
while(!receivedResponse && tries<MAXNUM){
//发送数据
ds.send(dp_send);
try{
System.out.println("发送数据成功");
//接收从服务端发送回来的数据
ds.receive(dp_receive);
//如果接收到的数据不是来自目标地址,则抛出异常
if(!dp_receive.getAddress().equals(loc)){
throw new IOException("Received packet from an umknown source");
}
//如果接收到数据。则将receivedResponse标志位改为true,从而退出循环
receivedResponse = true;
}catch(InterruptedIOException e){
//如果接收数据时阻塞超时,重发并减少一次重发的次数
tries += 1;
System.out.println("Time out," + (MAXNUM - tries) + " more tries..." );
}
}
if(receivedResponse){
//如果收到数据,则打印出来
String str_receive = new String(dp_receive.getData(),0,dp_receive.getLength()) +
" from " + dp_receive.getAddress().getHostAddress() + ":" + dp_receive.getPort();
System.out.println(str_receive);
//由于dp_receive在接收了数据之后,其内部消息长度值会变为实际接收的消息的字节数,
//所以这里要将dp_receive的内部消息长度重新置为1024
dp_receive.setLength(1024);
}else{
//如果重发MAXNUM次数据后,仍未获得服务器发送回来的数据,则打印如下信息
System.out.println("No response -- give up.");
}
ds.close();
}
/**
* UDP服务端接收数据,和返回数据到客户端
* @throws IOException
*/
public static void server() throws IOException {
String str_send = "Hello world";
byte[] buf = new byte[1024];
//服务端在10006端口监听接收到的数据
DatagramSocket ds = new DatagramSocket(10006);
//接收从客户端发送过来的数据
DatagramPacket dp_receive = new DatagramPacket(buf, 1024);
boolean f = true;
while(f){
//服务器端接收来自客户端的数据
ds.receive(dp_receive);
System.out.println("server received data from client:");
String str_receive = new String(dp_receive.getData(),0,dp_receive.getLength()) +
" from " + dp_receive.getAddress().getHostAddress() + ":" + dp_receive.getPort();
System.out.println(str_receive);
//数据发动到客户端的3000端口
DatagramPacket dp_send= new DatagramPacket(str_send.getBytes(),str_send.length(),dp_receive.getAddress(),9000);
ds.send(dp_send);
//由于dp_receive在接收了数据之后,其内部消息长度值会变为实际接收的消息的字节数,
//所以这里要将dp_receive的内部消息长度重新置为1024
dp_receive.setLength(1024);
}
ds.close();
}
}