zoukankan      html  css  js  c++  java
  • Java实例练习——基于UDP协议的多客户端通信

      昨天学习了UDP协议通信,然后就想着做一个基于UDP的多客户端通信(一对多),但是半天没做出来,今天早上在参考了很多代码以后,修改了自己的代码,然后运行成功,在这里分享以下代码,也说一下自己的认识误区:

      代码如下:

    //最核心的部分是在服务器端的线程部分
    package net;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class UdpServerThread extends Thread {		
    	DatagramSocket socket = null;
    	DatagramPacket getPacket = null;	
    	byte []msg = null;
    	public UdpServerThread(DatagramSocket socket,DatagramPacket getPacket,byte []msg){
    		this.socket = socket;
    		this.getPacket = getPacket;		
    		this.msg = msg;
    	}
    	public void run(){
    		//1、创建DategramSocket,指定端口号							
    				
    						
    				System.out.println("我是服务器,客户端说:"+new String(msg,0,getPacket.getLength()));
    				System.out.println("客户端的IP地址:"+getPacket.getAddress());
    				
    				//服务器向客户端发送响应信息
    				byte[] sendMsg = "欢迎您!".getBytes();
    				DatagramPacket sendPacket = new DatagramPacket(
    						sendMsg, sendMsg.length, getPacket.getAddress(), getPacket.getPort());
    				try {
    					socket.send(sendPacket);
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    	}
    
    }
    //然后是服务器端
    package net;
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    /**
     * 基于UDP协议的通信,服务器端
     * @author syskey
     *
     */
    public class UdpManyClientServ {	
    	
    		public static void main(String args[]) throws IOException{
    			//1、创建DategramSocket,指定端口号
    			int clientCount = 0;
    			
    			DatagramSocket socket = new DatagramSocket(8800);			
    			System.out.println("***服务器正在启动,等待客户端连接***");
    			byte[] msg = new byte[1024];
    			//2、创建Data个人啊没Packet,用于接收客户端信息
    			DatagramPacket getPacket =null;
    			
    			//2、创建Data个人啊没Packet,用于接收客户端信息
    			while(clientCount<10){						
    				try {
    					getPacket = new DatagramPacket(msg, msg.length);					
    					socket.receive(getPacket);
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    				UdpServerThread udpServerThread =new UdpServerThread(socket,getPacket,msg);
    				udpServerThread.start();
    				clientCount++;
    				System.out.println("客户端数量"+clientCount);
    				//System.out.println("客户端的IP地址:"+socket.getInetAddress().getHostAddress());
    			//}	
    			//socket.close();
    			}
    		}
    	}
    //客户端相对简单
    package net;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    
    /**
     * 基于UDP通信的客户端
     * @author syskey
     *
     */
    
    public class UdpClient {
    	
    	public static void main(String args[]) throws IOException{
    		byte[] sMsgbyte = "用户名:sysker;密码:128398908".getBytes();
    		InetAddress serverIp = InetAddress.getByName("localhost");
    		DatagramPacket packet = new DatagramPacket(sMsgbyte, sMsgbyte.length, serverIp, 8800);
    		DatagramSocket socket = null;
    		try {
    			socket = new DatagramSocket();
    		} catch (SocketException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		socket.send(packet);
    		
    		byte[] getMsg = new byte[1024];
    		DatagramPacket getPacket = new DatagramPacket(getMsg, getMsg.length);
    		socket.receive(getPacket);
    		System.out.println("我是客户端,服务器说:"+new String(getMsg,0,getPacket.getLength()));
    		socket.close();
    	}
    }

      实现UDP协议多客户端通信与TCP/IP协议不同,TCP/IP中和客户端相关就一个通信类(Socket类),但是对UDP协议来说和客户端相关的通信类有两个(DatagramSocket和DatagramPacket),而在多客户端通信中,核心部分就是处理客户端的通信类,所以思路是一样的。但一开始我就套用TCP/IP协议下的多客户端通信,没有认真的分析UDP通信协议的特点,更没有对比TCP/IP协议和UDP协议的区别,所以导致UDP多客户端通信不能实现。

      总结:学习JAVA时,不能生搬硬套,一定分析清楚其中的原理和区别,然后再去开始实践,不能上来就开始干代码。同时,在我们觉得自己已经掌握了某一个知识点时,最好是通过实践来练习一下,哪怕只是把之前你参考别人代码写的程序,重新按照刚才的思路写一遍,收获绝对不小,但前提条件是理解清楚原理,搞清楚思路。

  • 相关阅读:
    Codeforces 992C(数学)
    Codeforces 990C (思维)
    Codeforces 989C (构造)
    POJ 1511 Invitation Cards(链式前向星,dij,反向建边)
    Codeforces 1335E2 Three Blocks Palindrome (hard version)(暴力)
    POJ 3273 Monthly Expense(二分)
    POJ 2566 Bound Found(尺取前缀和)
    POJ 1321 棋盘问题(dfs)
    HDU 1506 Largest Rectangle in a Histogram(单调栈)
    POJ 2823 Sliding Window(单调队列)
  • 原文地址:https://www.cnblogs.com/caoleiCoding/p/6443818.html
Copyright © 2011-2022 走看看