网络编程(学习整理)---2--(Udp)实现简单的控制台聊天室
1、UDP协议:
总结一下,今天学习的一点知识点!
UDP也是一种通信协议,常被用来与TCP协议作比较!我们知道,在发送数据包的时候使用TCP协议比UDP协议安全,那么到底安全在哪里呢?怎么理解呢!
下面我说一下我的简单理解!
由于TCP协议是一种面向连接的协议,有三次挥手通信确认机制,且数据包没有代销限制,TCP协议确保在通信双方都收到对方确认信息的前提下,才开始为通信的双方传输信息(数据包)!
这样数据包的传输可以得到安全保障!所以简单的理解为安全的!当然一旦,出现网络问题,或者一些其他意外现象造成通信双方的连接出现异常或断开连接,使用TCP是不能传输信息的!
那么相对的!
UDP不是一种面向连接的协议,就是说,在使用UDP协议进行数据交互的时候,彼此可以不连接,通信的一端突然地向另外一端发送数据包,但是对方没有启动接收程序,那么对方当时是收不到数据包的,或者当你发送数据的过程中,突然出现意外断网,停电等等意外现象,都有可能造成对方收不到信息!也就说,你发送的信息对方没收到,同时你也不知道对方有没有收到!这不好!
说的有点绕了!现在举一个例子作比较吧!
场景:(1)在一个教室里面(例比:一个局域网内!)
(2)有小明和小美两个同学(例比:通信的双方!)
(3)小明要把一本书交给小美(例比:小明向小美发送一个数据包(书)!)
比较:
当TCP协议方式:
(1)tcp面向连接:
小明需要在班里找到小美,走到小美面前,亲手把手交给小美!小美确认小明给他书的是小明,然后接收到小明归还的书!
当UDP协议方式:
(1)udp不是面向连接:
小明从座位上站起来,看到小美在的位置方向,可能叫一声“小美”,或者什么也没说,直接把书朝着小美的位置方向!小美可能收到书,也可能没收到!
例子分析:
(1)TCP协议下的操作是可以确保小美收到小明归还的书的!
(2)UDP协议下的操作具有不确定性,可能扔书的时候,小美不知道走开了(接收端没有开启!)
可能扔书的时候,中间力道不够,没扔到位置处(网络断开,停电,或电脑出现异常等意外现象的发生!)
可能书在半空中被别人截获了(数据包被截获!)
这种方式数据的传送不能得到保证!不安全!但是速度快啊!直接扔就行了,不需要再走到小美面前!
2、UDP通讯协议的特点:
1. 将数据极封装为数据包,面向无连接。
2. 每个数据包大小限制在64K中
3.因为无连接,所以不可靠
4. 因为不需要建立连接,所以速度快
5.udp 通讯是不分服务端与客户端的,只分发送端与接收端。
比如: 物管的对讲机, 飞Q聊天、 游戏...
3、udp协议下的Socket:
DatagramSocket(udp插座服务)
DatagramPacket(数据包类)
DatagramPacket(buf, length, address, port)
buf: 发送的数据内容
length : 发送数据内容的大小。
address : 发送的目的IP地址对象
port : 端口号。
4、发送端的使用步骤:
1. 建立udp的服务。
2. 准备数据,把数据封装到数据包中发送。 发送端的数据包要带上ip地址与端口号。
3. 调用udp的服务,发送数据。
4. 关闭资源。
5、接收端的使用步骤:
1. 建立udp的服务
2. 准备空 的数据 包接收数据。
3. 调用udp的服务接收数据。
4. 关闭资源
6、UDP协议小案例(1):发送端和接收端的信息交互!
发送端:
package cn.udp; import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; /**
* UDP简单的小例子
* UDP协议下的
* 发送端
*
* @author 小风微灵
*
*/
public class UdpSend { public static void main(String[] args) throws Exception { System.out.println("发送端!");
//建立UDP服务插座
DatagramSocket send=new DatagramSocket(); //创建发送包
String content="哈哈哈,我是神!";
DatagramPacket packet=new DatagramPacket(content.getBytes(),
content.getBytes().length,
InetAddress.getLocalHost(),); //发送数据包
send.send(packet); //发送不是阻塞型的!
System.out.println("数据已发送....."); //关闭资源
send.close(); } }
接收端:
package cn.udp; import java.net.DatagramPacket;
import java.net.DatagramSocket; /**
* UDP简单的小例子
* UDP协议下的
* 接收端
*
* @author 小风微灵
*
*/
public class UdpAccept { public static void main(String[] args) throws Exception { System.out.println("接收端!");
//建立UDP服务插座
DatagramSocket accept=new DatagramSocket(); //创建空的数据包
byte[] buf=new byte[];
DatagramPacket packet=new DatagramPacket(buf, buf.length); //接收数据
accept.receive(packet); //只有接收是阻型的! //打印数据
System.out.println("接收到的数据:"+new String(buf,,packet.getLength())); //关闭
accept.close(); } }
6、UDP协议小案例(2):群聊(控制台实现)!
package cn.udp; import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; /**
* 模拟聊天室:(群聊)
* 协议支持:UDP
* @author 小风微灵
*
*/ public class UDPChatingRoom { public static void main(String[] args){
new ChatSend().start(); //启动发送端 new ChatAccep().start();//启动接收端
}
}
/**
* 群聊的接收端
*
*/
class ChatAccep extends Thread { public void run() { //插座
try { DatagramSocket reciver = new DatagramSocket(); byte[] buf = new byte[];
DatagramPacket packet = new DatagramPacket(buf, buf.length); boolean isFlag = true; while(isFlag){ reciver.receive(packet); //阻塞方法 System.out.println( packet.getAddress().getHostAddress() +":"+new String(buf, ,packet.getLength()));
} reciver.close(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }
/**
* 群聊的发送端
*
*/
class ChatSend extends Thread{ public void run() { try {
DatagramSocket send = new DatagramSocket();//插座 //得到键盘输入流
BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in)); String content = null; while((content = keyReader.readLine()) != null){ //数据包
DatagramPacket packet = new DatagramPacket(content.getBytes(), content.getBytes().length, InetAddress.getByName("127.0.0.1"), ); send.send(packet); System.out.println("发送端发送:"+content);
} send.close(); } catch (Exception e) {
e.printStackTrace();
}
} }
网络编程(学习整理)---2--(Udp)实现简单的控制台聊天室的更多相关文章
- 网络编程(学习整理)---1--(Tcp)实现简单的控制台聊天室
1.简单的聊天室(控制台): 功能实现: 客户端和服务端的信息交流: 2.牵扯到的知识点: 这个我大概说一下,详细后面见代码! 1) 网络通讯的三要素 1. IP 2. 端口号. 3. 协议 2) ...
- 66 网络编程(五)——TCP多线程实现多人聊天室
思路 客户端读写各一个类,可以使内部类,实现Runnable.读写类都与服务器端建立连接,一个收,一个发. 客户端实现接收和转发.多线程实现每个客户端的连接(使与各客户端的连接独立). 服务器端中创建 ...
- Windows平台VC++ 6.0 下的网络编程学习 - 简单的测试winsock.h头文件
最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自 ...
- Linux 系统编程 学习:07-基于socket的网络编程2:基于 UDP 的通信
Linux 系统编程 学习:07-基于socket的网络编程2:基于 UDP 的通信 背景 上一讲我们介绍了网络编程的一些概念.socket的网络编程的有关概念 这一讲我们来看UDP 通信. 知识 U ...
- 转 网络编程学习笔记一:Socket编程
题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...
- python语法基础-网络编程-TCP协议和UDP协议
############### 网络编程 ############## """ 网络编程 学习了Python基础之后,包括函数,面向对象等,你就可以开发了,你 ...
- C,C++网络编程学习简明指南
C,C++网络编程学习简明指南 1. 扎实的C,C++基础知识 参考资料<C程序设计>,<C++ primer>. 2. TCP/IP协议 经典书是:W.Richard Ste ...
- Linux C++ 网络编程学习系列(1)——端口复用实现
Linux C++ 网络编程学习系列(1)--端口复用实现 源码地址:https://github.com/whuwzp/linuxc/tree/master/portreuse 源码说明: serv ...
- 网游中的网络编程系列1:UDP vs. TCP
原文:UDP vs. TCP,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网 ...
随机推荐
- Resharper中注释代码的快捷键
Resharper中 Visual Studio中 注释代码 Ctrl+Alt+/ Ctrl+E+C 取消注释 Ctrl+Alt+/ ...
- (转载)如何优化MySQL insert性能
(转载)http://blog.csdn.net/tigernorth/article/details/8094277 对于一些数据量较大的系统,面临的问题除了是查询效率低下,还有一个很重要的问题就是 ...
- Linux下的各种软件安装方法汇总
1 RPM包 1.1 安装 RPM包就像Windows的EXE安装文件一样,各种文件都已经编译好了,并进行了打包,哪一个文件应该放在哪一个目录下都指定好了,安装非常方便,在图形界面里你只需要双击就能自 ...
- 基础排序算法之并归排序(Merge Sort)
并归排序是学习分治法 (Merge Sort) 的好例子.而且它相对于选择,插入,冒泡排序来说,算法性能有一定提升.我首先会描述要解决的问题,并给出一个并归排序的例子.之后是算法的思路以及给出伪代码. ...
- [Java] JavaMail 发送带图片的 html 格式的邮件
JavaMail 发送的邮件正文和附件是相互独立的,但是内置图片需要定位图片在正文中的位置,所以内置图片和邮件正文是互相依赖的. 发送带附件的邮件可参考JavaMail 发送 html 格式.带附件的 ...
- Android NDK开发指南---Application.mk文件和android.mk文件
https://android.googlesource.com/platform/development/+/donut-release/ndk/docs/OVERVIEW.TXT https:// ...
- 自动布局AutoLayout
1:理解概念 Auto Layout 中文翻译过来意思是 自动布局 ,通过内定的 Constraint (约束)和各项条件来计算出合理的布局.而这个合理的布局,符合我们的的预期和意图. 将我们想象中的 ...
- android ROM备份和还原,再也不用当心刷到垃圾ROM,而还原不了原有系统
安卓刷机后如何还原以前ROM 和系统备份,本教程为大家介绍刷机后如何还原到以前的ROM 和系统备份. 很多人,看到了好多新的rom,包括测试版的新rom,心里痒痒的.想刷一刷.尝尝鲜,结果刷完,感觉新 ...
- BZOJ1176: [Balkan2007]Mokia CDQ分治
最近很不对啊=w= 写程序全是bug啊 ans数组开小了竟然一直不知道,小数据没问题大数据拍不过,交上去RE 蛋疼半天 这个主要把每次询问拆成3个询问. #include<cstdio> ...
- Unity 读取、写入自定义路径文件,调用System.Windows.Forms
调用System.Windows.Forms DLL 首先在Unity新建Plugins文件夹添加System.Windows.Forms.dll 然后代码中添加引用 using System; us ...