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

  • 相关阅读:
    洛谷P1199三国游戏
    Cracking the Coding Interview 6.2
    Cracking the Coding Interview 5.2
    Cracking the Coding Interview 5.7
    洗牌算法
    字符串排列组合问题
    指针作为形参
    KMP算法代码
    搜索二叉树
    面试题集锦
  • 原文地址:https://www.cnblogs.com/caoleiCoding/p/6443818.html
Copyright © 2011-2022 走看看