33、Java入门—网络编程之UDP编程

来源:互联网 发布:雅思词汇推荐知乎 编辑:程序博客网 时间:2024/05/16 08:57
UDP编程
  1、UDP协议(用户数据报协议)是无连接、不可靠、无序的。
  2、UDP协议以数据报作为数据传输的载体。
  3、使用UDP进行数据传输时,首先需要将要传输的数据定义成数据报(Datagram),在数据报中指明所要达到的Socket(主机地址和端口号),然后在将数据报发生出去。
  4、相关操作类:DatagramPacket:表示数据报包
                 DatagramSocket:进行端到端通信的类


DatagramPacket类构造方法:
  1、DatagramPacket(byte[] buf,int length)//接受长度为length的数据包
  2、DatagramPacket(byte[] buf,int length,InetAddress address,int port)//将指定长度的字节发生到指定主机的指定端口


DatagramSocket类
  1、构造方法:DatagramSocket();
               DatagramSocket(int port,InetAddress laddr);
  2、close();//关闭DatagramSocket
  3、getInetAddress();//获取地址
  4、getPort();//获取端口号
  5、send(DatagramPacket p);//从此套接字发送数据包

     recrive(DatagramPacket p);//从此套接字接收数据包


服务器端实现步骤:
1、创建DatagramSocket,指定端口号
2、创建DatagramPacket
3、接收客户端发送的数据信息
4、读取数据

服务端具体代码:
1、创建服务器端DatagramSocket
DatagramSocket socket=DatagramSocket(8800);
2、创建数据报,用户接收客户端发送的数据
byte[] data=new byte[1024];
DatagramPacket packet=new datagramPacket(data,data.length);
3、接收客户端发送的数据
socket.receive(packet);//会处于阻塞,直到接收到数据报
4、读取数据
String info=new String(data,0,packet.getLength());
System.out.println("客户端说"+info);


客户端实现步骤:
1、定义发送信息
2、创建DatagramPacket:包含将要发送信息
3、创建DatagramSocket
4、发送数据

服务器端,实现基于UDP的用户登陆:
/*
* 接收客户端发送的数据
*/
//1.创建服务器端DatagramSocket,指定端口
DatagramSocket socket=new DatagramSocket(8800);
//2.创建数据报,用于接收客户端发送的数据
byte[] data =new byte[1024];//创建字节数组,指定接收的数据包的大小
DatagramPacket packet=new DatagramPacket(data, data.length);
//3.接收客户端发送的数据
System.out.println("****服务器端已经启动,等待客户端发送数据");
socket.receive(packet);//此方法在接收到数据报之前会一直阻塞
//4.读取数据
String info=new String(data, 0, packet.getLength());
System.out.println("我是服务器,客户端说:"+info);

/*
* 向客户端响应数据
*/
//1.定义客户端的地址、端口号、数据
InetAddress address=packet.getAddress();
int port=packet.getPort();
byte[] data2="欢迎您!".getBytes();
//2.创建数据报,包含响应的数据信息
DatagramPacket packet2=new DatagramPacket(data2, data2.length, address, port);
//3.响应客户端
socket.send(packet2);
//4.关闭资源
socket.close();

客户端
 /*
 * 向服务器端发送数据
*/
 //1.定义服务器的地址、端口号、数据
InetAddress address=InetAddress.getByName("localhost");
 int port=8800;
 byte[] data="用户名:admin;密码:123".getBytes();
 //2.创建数据报,包含发送的数据信息
DatagramPacket packet=new DatagramPacket(data, data.length, address, port);
 //3.创建DatagramSocket对象
DatagramSocket socket=new DatagramSocket();
 //4.向服务器端发送数据报
socket.send(packet);


 /*
 * 接收服务器端响应的数据
*/
 //1.创建数据报,用于接收服务器端响应的数据
byte[] data2=new byte[1024];
 DatagramPacket packet2=new DatagramPacket(data2, data2.length);
 //2.接收服务器响应的数据
socket.receive(packet2);
 //3.读取数据
String reply=new String(data2, 0, packet2.getLength());
 System.out.println("我是客户端,服务器说:"+reply);
 //4.关闭资源
socket.close();

基于UDP的多线程实现多客户端通信
服务器端:
DatagramSocket socket=new DatagramSocket(8818);
byte[] data=new byte[1024];
System.out.println("****服务器启动,等待客户端连接****");
int count=1;
while(true){
DatagramPacket packet=new DatagramPacket(data, data.length);
socket.receive(packet);
ServerThread serverThread=new ServerThread(packet, socket);
serverThread.start();
System.out.println("客户端数量:"+count++);


服务器线程处理类:
public class ServerThread extends Thread {
DatagramPacket packet;
DatagramSocket socket;

public ServerThread(DatagramPacket packet, DatagramSocket socket) {
super();
this.packet = packet;
this.socket = socket;
}


public void run(){
//获取客户端信息
byte[] data=packet.getData();
String info1=new String(data, 0, packet.getLength());
System.out.println("客户端说:"+info1);
//响应客户端
InetAddress address=packet.getAddress();
int port=packet.getPort();
byte[] data1="欢迎您!".getBytes();
DatagramPacket packet1=new DatagramPacket(data1, data1.length, address, port);
}
}

0 0