62 网络编程(三)——UDP编程
UDP编程标准步骤
服务器端
- 使用DatagramSocket创建服务端:DatagramSocket server = new DatagramSocket(port);//参数为自定义端口号
- 准备接受容器1:必须是byte数组
- 使用DatagramPacket创建接受容器2:DatagramPacket packet = new DatagramPacket(容器1,start,length);//容器2的名字写为了packet
- 接受数据:serve.receive(packet);
- 处理数据:此时数据已经存储到容器1中,对容器1处理即可
- 关闭:根据需要关闭服务端 server.close()
客户端
- 使用DatagramSocket创建客户端:DatagramSocket client = new DatagramSocket(port);//参数为自定义端口号
- 准备数据:必须是byte数组
- 使用DatagramPacket创建packet包:DatagramPacket packet = new DatagramPacket(数据数组,start,数组length,new InetSocketAddress("目标主机地址",port));
- 发送数据:client.send(packet);
- 关闭 :client.close()
以下为一个实例
先启用服务器端,再启动客户端,然后查看服务器端的console结果
Server端
public static void main(String[] args) throws IOException{ System.out.println("服务端启动"); //创建客户端 DatagramSocket server = new DatagramSocket(9917); //创建容器 byte[] container = new byte[1024*60]; //创建packet DatagramPacket packet = new DatagramPacket(container,0,container.length); //接收数据 server.receive(packet); //处理数据 System.out.println(new String(container,0,container.length)); //关闭 server.close(); }
client端
public static void main(String[] args) throws IOException{ System.out.println("客户端启动"); //创建客户端 DatagramSocket client = new DatagramSocket(12454); //准备数据 String str = "最后一遍了"; byte[] datas = str.getBytes(); //创建packet DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",9917)); //发送 client.send(packet); //关闭 client.close(); }
运行结果:
服务端启动 最后一遍了
多线程UDP发送与接收
我们将客户端与服务器端各写为一个实现了Runnale的类,这样在其它地方就可以使用线程来启动这两个端,达到双向交流的目的。
Server端
package _20191218; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; /** * UDP实现接收 * @author TEDU * */ public class ThreadReceive implements Runnable{ private int port; public ThreadReceive(int port) { this.port = port; } public void run() { //创建服务器端 System.out.println("服务端开启"); DatagramSocket server = null; try { server = new DatagramSocket(port); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } //创建容器 byte[] container; //创建packet DatagramPacket packet; while(true) { container = new byte[1024*10]; packet = new DatagramPacket(container,0,container.length); //接收 try { server.receive(packet); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //处理 String message = new String(container,0,packet.getLength()); System.out.println(message); // System.out.println(message.equals("quit")); //释放 if(message.equals("quit")) { break; } } server.close();//释放 } }
Client端
package _20191218; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketException; import java.util.Scanner; /** * UDP实现发送 * @author TEDU * */ public class ThreadSend implements Runnable{ private int port; private int toPort; private String address; public ThreadSend(int port,int toPort,String address){ this.port = port; this.toPort = toPort; this.address = address; } public void run() { //创建客户端 System.out.println("客户端开启"); DatagramSocket client = null; BufferedReader reader = null; Scanner scan = new Scanner(System.in); String message = null; byte[] datas; DatagramPacket packet; try { reader = new BufferedReader(new InputStreamReader(System.in)); client = new DatagramSocket(port); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } //准备数据 while(true) { // message = scan.nextLine(); try { message = reader.readLine(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } datas = message.getBytes(); //packet packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(address,toPort)); //发送 try { client.send(packet); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } message = new String(datas,0,packet.getLength()); if(message.equals("quit")) break; } client.close(); } }
用户1
package _20191218; public class Talker1 { public static void main(String[] args) { //接收 new Thread(new ThreadReceive(5577)).start();//接收端口 5577 //发送 new Thread(new ThreadSend(5566,6677,"localhost")).start();//发送端口 5566 } }
用户2
package _20191218; public class Talker2 { public static void main(String[] args) { //接收 new Thread(new ThreadReceive(6677)).start();//接收端口 6677 //发送 new Thread(new ThreadSend(6666,5577,"localhost")).start(); } }