zoukankan      html  css  js  c++  java
  • udp 局域网群聊

    UDP:
    无连接协议
    udp协议发送数据,用的是数据报包的形式。(64KB以内)
     
     
    发送端:
    1.定义发送的datagramsocket对象,发送端可以不用定义端口
    2.定义封装数据包datagrampacket
    3.发送数据包
    4.关闭资源
     
    //InetAddress.getByName("192.168.3.255")必须是统一的网段
     
    public class UdpSendThread implements Runnable {
    
    	DatagramSocket ds;
    	byte[] buf;
    
    	public UdpSendThread(DatagramSocket ds) {
    		this.ds = ds;
    	}
    
    	public UdpSendThread(DatagramSocket ds, String str) {
    
    		this.ds = ds;
    		this.buf = str.getBytes();
    	}
    
    	@Override
    	public void run() {
    
    		String brStr;
    		try {
    			BufferedReader br = new BufferedReader(new InputStreamReader(System.in, "utf-8"));
    	
    			
    				while ((brStr = br.readLine()) != null) {
    
    					if(brStr.startsWith("@")){
    						
    					}
    				
    					DatagramPacket dp = new DatagramPacket(brStr.getBytes(), brStr.getBytes().length,
    							InetAddress.getByName("192.168.3.255"), 9000);
    
    					ds.send(dp);
    					if (brStr.equals("over")) {
    						break;
    					}
    
    				}
    			
    		
    			//br.close();
    			ds.close();
    		} catch (UnknownHostException | UnsupportedEncodingException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    

      

    接收端:
    1、建立DatagramSocket对象
    2、定义一个空的数据包
    3、接受数据包
    4、解析数据包
    5、关闭资源
    public class UdpRececiveThread extends Thread {
    
    	DatagramSocket ds;
    	
    	public UdpRececiveThread(DatagramSocket ds) {
    		
    		this.ds = ds;
    	}
    	
    	@Override
    	public void run() {
    		
    		while(true){
    			byte[] buf = new byte[1024*1024];
    			DatagramPacket dp = new DatagramPacket(buf, buf.length);
    			
    			try {
    				ds.receive(dp);
    				String ip = dp.getAddress().getHostAddress();
    				String content = new String(dp.getData(),0,dp.getLength());
    				if(content.equals("over")){
    					System.out.println(ip+"退出");
    				}
    				
    				System.out.println(ip+":"+content);
    				
    				
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    			
    		}
    	}
    }
    

      测试类:

    	public static void main(String[] args) throws SocketException {
    		
    		DatagramSocket sendDs = new DatagramSocket();
    		DatagramSocket reDs = new DatagramSocket(9000);
    	    new Thread(new UdpSendThread(sendDs)).start();;
    		new UdpRececiveThread(reDs).start();
    	}
    

      

  • 相关阅读:
    PHP获取指定的时间戳
    Thinkphp实现excel数据的导出
    ThinkPHP按月统计订单总金额
    PHP获取本月起始和终止时间戳
    ThinkPHP 判断一个更新操作是否成功
    js 通过浏览器直接打开应用程序(IOS,Android)并判断浏览器内核
    ThinkPHP 后台管理删除、编辑操作(通过数组传ID)
    PHP面向对象
    【转】Chrome调试鼠标悬停后出现的元素
    【重要】Selenium2+python自动化44-元素定位参数化(find_element)
  • 原文地址:https://www.cnblogs.com/ShengXi-1994/p/5581109.html
Copyright © 2011-2022 走看看