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

转载于:https://www.cnblogs.com/caoleiCoding/p/6443818.html

Java实例练习——基于UDP协议的多客户端通信相关推荐

  1. Java学习系列(十八)Java面向对象之基于UDP协议的网络通信

    UDP协议:无需建立虚拟链路,协议是不可靠的. A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达:但有些情况下,数据报可能会丢失 ...

  2. Java网络编程——基于UDP协议的聊天室

    UDP简述    UDP(User Datagram Protocol)协议是Internet 协议集支持的一个无连接的传输协议,中文名为用户数据报协议.它为应用程序提供了一种无需建立连接就可以发送封 ...

  3. 微信小程序基于udp协议与esp8266进行通信

    1.概述 微信小程序有关于UDP协议的API,具体内容可前往官网查看:整体实现的思路就是利用路由组一个局域网,手机.路由器和esp8266,手机和esp8266连接路由器,登录路由器查看esp8266 ...

  4. java udp包_基于UDP协议的数据包收发程序(代码+报告)Java

    [实例简介] 设计要求: 1)按照UDP协议数据包发送方式实现用户端之间的通信. 2)统计包的发送和接收数,计算数据包的丢失数. 3)设计美观易用的图形界面. [实例截图] [核心代码] 基于UDP协 ...

  5. java udp简单聊天程序_Java基于UDP协议实现简单的聊天室程序

    最近比较闲,一直在抽空回顾一些java方面的技术应用. 今天没什么事做,基于udp协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对java网络编程方面的一个简单回忆. ...

  6. java udp 聊天室_Java基于UDP协议实现简单的聊天室程序

    最近比较闲,一直在抽空回顾一些Java方面的技术应用. 今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆. ...

  7. android udp定时发送,Android Socket基于UDP协议通信

    首先我们要知道UDP通信协议是Socket通信的一种实现方式,Socket通信一般有两种通信方式:基于TCP协议.基于UDP协议.这两者的差别和优缺点就不说了,这里主要讲一下基于UDP协议的实现. 基 ...

  8. 网络编程应用:基于UDP协议【实现文件下载】--练习

    要求: 基于UDP协议实现文件下载 发送方–请求–接收方发送文件–发送方接收文件 代码: 发送方: package Homework1;import java.io.File; import java ...

  9. 基于UDP协议的局域网网络聊天工具

    /* * 本程序实现了基于UDP协议的局域网网络聊天工具. * 参考网上的源码,发现一个calss就可以搞定. * ChatFrame类创建窗口,包含JTextField和TextArea. * 前者 ...

最新文章

  1. 从奥运订票系统说起——谈FastCGI 与IT 架构
  2. 百度搜索效果(页面传来数据地址,由服务器去获取)
  3. python文件指针放在文件的开头_将文件指针倒带到上一个lin的开头
  4. java线程池有哪几种,真香系列
  5. ASP.NET Core MVC上传、导入、导出知多少
  6. 移动WEB的页面布局
  7. 40个Java 多线程问题总结
  8. 采用python解决实际问题_应用 Python 解决一些实际问题
  9. jquery跨域请求示例
  10. python列表转集合_Python数据类型 列表、元组、集合、字典的区别和相互转换
  11. Excel的Range对象(C#)
  12. 【论文翻译】Image Super-Resolution Using Deep Convolutional Networks
  13. linux模拟gps,Android之GPS研究(实战篇二)
  14. 小白学 Python 爬虫(24):2019 豆瓣电影排行
  15. android m是什么单位,M代表什么单位?
  16. 微信朋友圈马赛克图片 —— 抓包破解
  17. 这个世界上,没有什么是实实在在的, 都是空虚,虚无, 空虚的空,虚无的虚,无的无....
  18. 作业录屏+露脸+视频裁剪+字幕添加(支持双语)
  19. Handler原理剖析
  20. (侯捷C++)1.1面向对象高级编程(上)

热门文章

  1. php/js互传cookie中文乱码的问题
  2. 实战Centos系统部署Codis集群服务
  3. 避免Gson使用时将一些字符自动转换为Unicode转义字符
  4. jsp网页上实现计算三角形面积小程序
  5. linux内核网络子系统收发过程剖析
  6. (59)简单介绍RAM IP核类型和接口信号?
  7. (75)FPGA随机函数($random)
  8. (27)System Verilog设计UART接收
  9. 计算机数值数据的编码,计算机数值数据编码(原码,反码,补码,移码)
  10. 给单文档框架添加背景图