zoukankan      html  css  js  c++  java
  • 网络编程(学习整理)---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  }
  • 相关阅读:
    Interview with BOA
    Java Main Differences between HashMap HashTable and ConcurrentHashMap
    Java Main Differences between Java and C++
    LeetCode 33. Search in Rotated Sorted Array
    LeetCode 154. Find Minimum in Rotated Sorted Array II
    LeetCode 153. Find Minimum in Rotated Sorted Array
    LeetCode 75. Sort Colors
    LeetCode 31. Next Permutation
    LeetCode 60. Permutation Sequence
    LeetCode 216. Combination Sum III
  • 原文地址:https://www.cnblogs.com/newwind/p/5661549.html
Copyright © 2011-2022 走看看