UDP网络编程的一个例子:多线程处理客户端的请求和服务器端的响应。其中客户端的数据请求是键盘录入数据,且以字符串"886”作为结束标记。服务器端则输出客户端的IP地址以及请求中数据的内容。
测试类:
package MutiUDPDemo;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* 键盘录入处理
* 一个线程处理客户端请求,一个线程处理服务器端响应
* UDP 测试类
* @author feige
*/
public class Demo {
public static void main(String[] args) throws SocketException {
DatagramSocket dsSend=new DatagramSocket();//创建客户端socket对象
DatagramSocket dsRecive=new DatagramSocket(55328);//创建服务器端socket对象
SendSever send=new SendSever(dsSend);//客户端处理对象
RecieveSever recieve=new RecieveSever(dsRecive);//服务器端处理对象
//线程处理
Thread s=new Thread(send);
Thread r=new Thread(recieve);
r.start();
s.start();
}
}
客户端 UDP协议发送数据的步骤如下:
1.创建socket对象
2.创建数据并打包
3.调用socket方法的发送方法发送数据
4.释放资源(socket 底层使用io流来传输数据)
package MutiUDPDemo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 客户端处理
* @author feige
*/
public class SendSever implements Runnable {
private DatagramSocket dsSend = null;//客户端socket对象
public SendSever(DatagramSocket dsSend) {
this.dsSend = dsSend;
}
@Override
public void run() {
try{
//包装键盘录入流为高效的字符流
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = br.readLine()) != null) {
if ("886".equals(line))//键盘录入停止标记
break;
byte[] by = line.getBytes();
int length = by.length;
InetAddress ia=InetAddress.getByName("127.0.0.1");
int port = 55328;
DatagramPacket dp = new DatagramPacket(by, length, ia, port);//数据打包
dsSend.send(dp);//调用socket方法的发送方法发送数据
}
}catch(IOException e){
e.printStackTrace();
}finally{
dsSend.close(); //释放资源
}
}
}
服务器端
UDP接收数据的步骤:
1.创建socket对象
2.创建接收数据的容器
3.socket接收数据
4.解析数据
5.关闭资源
package MutiUDPDemo;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 服务器端处理
* @author feige
*/
public class RecieveSever implements Runnable {
private DatagramSocket dsRecive=null;//服务器端socket对象
public RecieveSever(DatagramSocket dsRecive) {
this.dsRecive=dsRecive;
}
@Override
public void run() {
try{
while(true){
byte[] by=new byte[1024];//创建接收数据的容器
int length=by.length;
DatagramPacket dp=new DatagramPacket(by, length);
dsRecive.receive(dp);//阻塞式,socket接收数据
InetAddress ia=dp.getAddress();
String ip=ia.getHostAddress();
//解析数据
byte[] data=dp.getData();
int le=dp.getLength();
String s=new String(data,0,le);
System.out.println("ip:"+ip+"--->"+s);
}
}catch(IOException e){
e.printStackTrace();
}finally{
System.out.println("服务器结束");
dsRecive.close();//关闭资源
}
}
}
运行结果: