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