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

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

  1. 网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket

    目录 基于UDP协议的套接字编程 UDP套接字简单示例 服务端 客户端 基于socketserver实现并发的socket 基于TCP协议 server类 request类 继承关系 服务端 客户端1 ...

  2. JAVA基础知识之网络编程——-基于UDP协议的通信例子

    UDP是一种不可靠的协议,它在通信两端各建立一个socket,这两个socket不会建立持久的通信连接,只会单方面向对方发送数据,不检查发送结果. java中基于UDP协议的通信使用DatagramS ...

  3. 基于UDP协议的网络编程

    UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象. Java使用DatagramSock ...

  4. java 网络编程基础 UDP协议的Socket:DatagramSocket;广播Socket:MulticastSocket

    什么是UDP协议: UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket 但这两个 Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象.Java 提供了 ...

  5. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  6. 基于UDP协议的控制台聊天

    这几天学了java的网络编程弄出一个基于UDP协议的聊天工具 功能 添加并且备注好友(输入对方的ip) 删除好友 查看好友列表 用java写的控制台程序导出可执行程序后不能双击打开 还需要些一个脚本文 ...

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

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

  8. (1)基于tcp协议的编程模型 (2)tcp协议和udp协议的比较 (3)基于udp协议的编程模型 (4)反射机制

    1.基于tcp协议的编程模型(重中之重)1.1 编程模型服务器: (1)创建ServerSocket类型的对象,并提供端口号: (2)等待客户端的连接请求,调用accept()方法: (3)使用输入输 ...

  9. 计算机网络课设之基于UDP协议的简易聊天机器人

    前言:2017年6月份计算机网络的课设任务,在同学的帮助和自学下基本搞懂了,基于UDP协议的基本聊天的实现方法.实现起来很简单,原理也很简单,主要是由于老师必须要求使用C语言来写,所以特别麻烦,而且C ...

随机推荐

  1. [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)

    简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作.  这就可以使用线程来实现. ...

  2. python习题-判断输入字符串是不是小数类型

    写一个能判断输入的字符串是不是个小数类型的1,判断小数点的个数是否为1 count2,判断是否小数右边是整数 isdigit3,判断小数点左边的1,整数 isdigit ,2如果是负整数,取负号右边, ...

  3. 使用jquery执行ajax

    $.ajax():返回其创建的XMLHttpRequest对象 回调函数:如果要处理$.ajax()得到的数据,则应该使用回调函数!beforeSend:在发送请求之后调用,需要一个XMLHttpRe ...

  4. 【leetcode刷题笔记】Plus One

    Given a non-negative number represented as an array of digits, plus one to the number. The digits ar ...

  5. C++ STL, sort用法。

    在algorithm头文件中的sort可以给任意对象排序,包括内置类型和自定义类型,前提是定义了“<“运算符. sort(begin,end),表示一个范围,例如: #include" ...

  6. 【Python】正则表达式中使用变量

    我们有时想把变量放进正则表达式中来匹配想要的结果.Python中使用 re.compile(r''+变量+''),其中正则表达式中的“变量”应为字符串形式. import re regex_test_ ...

  7. JavaScript RegExp 正则表达式基础详谈

    前言: 正则对于一个码农来说是最基础的了,而且在博客园中,发表关于讲解正则表达式的技术文章,更是数不胜数,各有各的优点,但是就是这种很基础的东西,如果我们不去真正仔细研究.学习.掌握,而是抱着需要的时 ...

  8. Poj 1017 Packets(贪心策略)

    一.题目大意: 一个工厂生产的产品用正方形的包裹打包,包裹有相同的高度h和1*1, 2*2, 3*3, 4*4, 5*5, 6*6的尺寸.这些产品经常以产品同样的高度h和6*6的尺寸包袱包装起来运送给 ...

  9. UE3代码阅读需知

    转自:http://www.cnblogs.com/hmxp8/archive/2012/02/21/2361211.html 掌握一款庞大的引擎,要一下子掌握真的很难,慢慢地从Editor,Scri ...

  10. Mac搭建nginx+rtmp服务器

    nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择,本人在网上整理了安装流程,分享给大家并且作备忘. 一.安装Homebrow 已经安装了brow的可以直接跳过这 ...