• 网络编程(学习整理)---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):发送端和接收端的信息交互!

    发送端:

     1 package cn.udp;
     2 
     3 import java.net.DatagramPacket;
     4 import java.net.DatagramSocket;
     5 import java.net.InetAddress;
     6 
     7 /**
     8  * UDP简单的小例子
     9  * UDP协议下的
    10  *             发送端
    11  *     
    12  * @author 小风微灵
    13  *
    14  */
    15 public class UdpSend {
    16 
    17 
    18     public static void main(String[] args) throws Exception {
    19         
    20         System.out.println("发送端!");
    21         //建立UDP服务插座
    22         DatagramSocket send=new DatagramSocket();
    23         
    24         //创建发送包
    25         String content="哈哈哈,我是神!";
    26         DatagramPacket packet=new DatagramPacket(content.getBytes(), 
    27                                                  content.getBytes().length,
    28                                                  InetAddress.getLocalHost(),9080);
    29         
    30         //发送数据包
    31         send.send(packet);    //发送不是阻塞型的!
    32         System.out.println("数据已发送.....");
    33         
    34         
    35         
    36         //关闭资源
    37         send.close();
    38         
    39     }
    40 
    41 }

    接收端

     1 package cn.udp;
     2 
     3 import java.net.DatagramPacket;
     4 import java.net.DatagramSocket;
     5 
     6 /**
     7  * UDP简单的小例子
     8  * UDP协议下的
     9  *             接收端
    10  *     
    11  * @author 小风微灵
    12  *
    13  */
    14 public class UdpAccept {
    15 
    16     
    17     public static void main(String[] args) throws Exception {
    18         
    19         System.out.println("接收端!");
    20         //建立UDP服务插座
    21         DatagramSocket accept=new DatagramSocket(9080);
    22         
    23         //创建空的数据包
    24         byte[] buf=new byte[1024];
    25         DatagramPacket packet=new DatagramPacket(buf, buf.length);
    26         
    27         //接收数据
    28         accept.receive(packet);    //只有接收是阻型的!
    29         
    30         //打印数据
    31         System.out.println("接收到的数据:"+new String(buf,0,packet.getLength()));
    32         
    33         //关闭
    34         accept.close();
    35 
    36         
    37     }
    38 
    39 }

    6、UDP协议小案例(2):群聊(控制台实现)!

     1 package cn.udp;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.InputStreamReader;
     5 import java.net.DatagramPacket;
     6 import java.net.DatagramSocket;
     7 import java.net.InetAddress;
     8 
     9 /**
    10  * 模拟聊天室:(群聊)
    11  *     协议支持:UDP
    12  * @author 小风微灵
    13  *
    14  */
    15 
    16 
    17 public class UDPChatingRoom {
    18     
    19     public static void main(String[] args){
    20             new ChatSend().start(); //启动发送端        
    21         
    22             new ChatAccep().start();//启动接收端
    23     }
    24 }
    25 /**
    26  * 群聊的接收端
    27  *
    28  */
    29  class ChatAccep extends Thread {
    30 
    31     public void run() {
    32         
    33         //插座
    34         try {
    35             
    36             DatagramSocket reciver = new DatagramSocket(9999);
    37             
    38             byte[] buf = new byte[1024];
    39             DatagramPacket packet = new DatagramPacket(buf, buf.length);
    40             
    41             boolean isFlag = true;
    42             
    43             while(isFlag){
    44                 
    45                 reciver.receive(packet); //阻塞方法
    46                 
    47                 System.out.println( packet.getAddress().getHostAddress() +":"+new String(buf, 0,packet.getLength()));
    48             }
    49             
    50             reciver.close();
    51             
    52         } catch (Exception e) {
    53             // TODO Auto-generated catch block
    54             e.printStackTrace();
    55         }
    56         
    57         
    58     }
    59     
    60 }
    61  /**
    62   * 群聊的发送端
    63   *
    64   */
    65   class ChatSend extends Thread{
    66 
    67      public void run() {
    68          
    69          try {
    70              DatagramSocket  send = new DatagramSocket();//插座
    71              
    72              //得到键盘输入流
    73              BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
    74              
    75              String content = null;
    76              
    77              while((content = keyReader.readLine()) != null){
    78                  
    79                  //数据包
    80                  DatagramPacket packet = new DatagramPacket(content.getBytes(), content.getBytes().length, InetAddress.getByName("127.0.0.1"), 9999);
    81                  
    82                  send.send(packet);
    83                  
    84                  System.out.println("发送端发送:"+content);
    85              }
    86              
    87              send.close();
    88              
    89          } catch (Exception e) {
    90              e.printStackTrace();
    91          }
    92      }
    93 
    94  }
  • 相关阅读:
    回顾2016,工作总结!
    上传base64格式的图片到服务器
    input输入提示历史记录
    input输入时软键盘回车显示搜索
    JS设置和读取Cookie
    正则表达式识别字符串中的URL
    X-Frame-Options配置
    pytest学习笔记
    测试理论基础总结
    redis杂七杂八
  • 原文地址:https://www.cnblogs.com/newwind/p/5661549.html
Copyright © 2020-2023  润新知