UDP编程:
将要传输的数据定义成数据包(Datagram),在数据报中指明所要到达的Socket(主机地址和端口号),然后再将数据报发送出去。
相关操作类: DatagramPacket 数据报包
DatagramSocket 进行端到端通信的类
服务器端实现步骤:
- 创建DatagramSocket,指定端口号
- 创建DatagramPacket
- 接收客户端发送的数据信息
- 读取数据
客户端实现步骤:
- 定义发送信息
- 创建DatagramPacket,包含将要发送的信息
- 创建DatagramSocket
- 发送信息
服务器端:
public class UDPServer { public static void main(String[] args) throws IOException { /* * 接收客户端发送的数据 */ //1.创建服务器端DatagramSocket,指定端口 DatagramSocket socket=new DatagramSocket(8888); System.out.println("服务器端已经启动,等待客户端发送数据"); while(true){ //2.创建数据报,用于接收客户端发送的数据 byte[] data=new byte[1024];//创建字节数组指定接收的数据包大小 DatagramPacket packet=new DatagramPacket(data, data.length); //3.接收客户端发送的数据 socket.receive(packet);//此方法在接收到数据报之前一直处于阻塞状态 UDPThread udpthread=new UDPThread(packet,socket); udpthread.start(); } } }
Tips:在UDPServer类中每次都要重新创建一个Packet
客户端:
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; /* * 客户端 */ public class UDPClient { public static void main(String[] args) throws IOException { /* * 向服务器端发送数据 */ //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多线程类:
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.Socket; import java.net.SocketException; public class UDPThread extends Thread { DatagramPacket packet=null; DatagramSocket socket=null; public UDPThread(DatagramPacket packet,DatagramSocket socket){ this.packet=packet; this.socket=socket; } public void run() { try { //4.读取数据 String info=new String(packet.getData(), 0, packet.getLength()); System.out.println("我是服务器,客户端说:"+info); /* * 向客户端响应数据 */ //1.定义客户端的地址、端口号、数据 InetAddress address=packet.getAddress(); int port=packet.getPort(); byte[] bytes="欢迎您".getBytes(); //2.创建数据报,包含响应的数据信息 DatagramPacket packet2=new DatagramPacket(bytes, bytes.length, address, port); //3.响应客户端 socket.send(packet2); } catch (IOException e) { e.printStackTrace(); } //socket.close();不能关闭 } }
另一种方法:
服务器端:
import java.net.*; import java.io.*; public class TestUDPServer { public static void main(String args[]) throws Exception { byte buf[] = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); DatagramSocket ds = new DatagramSocket(5678); while(true) { ds.receive(dp); ByteArrayInputStream bais = new ByteArrayInputStream(buf); DataInputStream dis = new DataInputStream(bais); System.out.println(dis.readLong()); } } }
客户端:
import java.net.*; import java.io.*; public class TestUDPClient { public static void main(String args[]) throws Exception { long n = 10000L; ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeLong(n); byte[] buf = baos.toByteArray(); DatagramPacket dp = new DatagramPacket(buf, buf.length,new InetSocketAddress("127.0.0.1", 5678) ); DatagramSocket ds = new DatagramSocket(9999); ds.send(dp); ds.close(); } }