zoukankan      html  css  js  c++  java
  • 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();
    	}
    }
    

      

    运行测试

  • 相关阅读:
    linux 常用命令
    ubuntu 安装在硬盘与配置
    linux管道符、重定向与环境变量
    linux用户身份与文件权限
    centos开启ftp服务
    js实现常见排序算法
    算法分析
    Vim
    CSS的3种使用方法
    cookie 在登录时的存储,获取,清除
  • 原文地址:https://www.cnblogs.com/Scorpicat/p/12050140.html
Copyright © 2011-2022 走看看