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. 网络编程(学习整理)---1--(Tcp)实现简单的控制台聊天室

    1.简单的聊天室(控制台): 功能实现: 客户端和服务端的信息交流: 2.牵扯到的知识点: 这个我大概说一下,详细后面见代码! 1) 网络通讯的三要素 1. IP 2. 端口号. 3. 协议   2) ...

  2. 66 网络编程(五)——TCP多线程实现多人聊天室

    思路 客户端读写各一个类,可以使内部类,实现Runnable.读写类都与服务器端建立连接,一个收,一个发. 客户端实现接收和转发.多线程实现每个客户端的连接(使与各客户端的连接独立). 服务器端中创建 ...

  3. Windows平台VC++ 6.0 下的网络编程学习 - 简单的测试winsock.h头文件

    最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自 ...

  4. Linux 系统编程 学习:07-基于socket的网络编程2:基于 UDP 的通信

    Linux 系统编程 学习:07-基于socket的网络编程2:基于 UDP 的通信 背景 上一讲我们介绍了网络编程的一些概念.socket的网络编程的有关概念 这一讲我们来看UDP 通信. 知识 U ...

  5. 转 网络编程学习笔记一:Socket编程

    题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...

  6. python语法基础-网络编程-TCP协议和UDP协议

    ###############    网络编程    ############## """ 网络编程 学习了Python基础之后,包括函数,面向对象等,你就可以开发了,你 ...

  7. C,C++网络编程学习简明指南

    C,C++网络编程学习简明指南 1. 扎实的C,C++基础知识 参考资料<C程序设计>,<C++ primer>. 2. TCP/IP协议 经典书是:W.Richard Ste ...

  8. Linux C++ 网络编程学习系列(1)——端口复用实现

    Linux C++ 网络编程学习系列(1)--端口复用实现 源码地址:https://github.com/whuwzp/linuxc/tree/master/portreuse 源码说明: serv ...

  9. 网游中的网络编程系列1:UDP vs. TCP

    原文:UDP vs. TCP,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网 ...

随机推荐

  1. 命令行利器Tmux

    Tmux是一个优秀的终端复用软件,类似GNU Screen,但是对两个软件评价已经是一边倒了,大多数人认为tmux功能更加强大,使用更加方便. Tmux不仅可以提高终端工作效率,是服务器管理工作必不可 ...

  2. activity+fragment多次切换出现页面空白问题

    刚上手一个项目 懒的用viewpager+fragment模式,尽管在后面的项目中还是用到viewpager+fragment.先说说问题,多次切换fragment的时候页面出现空白,刚开始以为传递的 ...

  3. 配置Myeclipse中的项目部署到服务器,报the selected server is enabled, but is not configured properly.

    the selected server is enabled, but is not configured properly. deployment to it will not be permitt ...

  4. Tree2cycle

    Problem Description A tree with N nodes and N-1 edges is given. To connect or disconnect one edge, w ...

  5. Aix项目_shell_rsh_01

    rsh(remote shell) 功能说明:远端登入Shell. 语 法:rsh [-dn][-l <用户名称>][主机名称或IP地址][执行指令] 补充说明:rsh提供用户环境,也就是 ...

  6. Sysrq 诊断系统故障 与 gdb 调试core dump

    1. 典型应用场景如:    1)系统进入了挂死状态(如调度出现异常.或系统负荷过重),但仍能响应中断,此时可以通过Sysrq魔术键(c)手工触发panic,结合kdump,就能收集到vmcore信息 ...

  7. AWK调用SHELL,并将变量传递给SHELL

    在Shell脚本中调用awk是非常自然和简单的,以前还写过一个关于awk/shell相互传递变量的文章:awk与shell之间的变量传递方法在awk脚本中,如果需要调用shell脚本/命令,则需要使用 ...

  8. php类获取静态变量值以及调用

    <?php class Test{ public static $static_var = 20; } echo Test::$static_var;exit;

  9. Java 23种设计模式详尽分析与实例解析之二--结构型模式

    Java设计模式 结构型模式 适配器模式 模式动机:在软件开发中采用类似于电源适配器的设计和编码技巧被称为适配器模式.通常情况下,客户端可以通过目标类的接口访问它所提供的服务.又是,现有的类可以满足客 ...

  10. Java语言基础(一)

    Java语言基础(一) 在这里说明一下,有基础的跳过 高手跳过.在这里我想复习以前的东西,以及给正在学java的一些帮助 我用的MyEclipse8.5编写java代码,有需要联系我  QQ:9035 ...