网络编程(学习整理)---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  }
时间: 2024-10-21 00:12:37

网络编程(学习整理)---2--(Udp)实现简单的控制台聊天室的相关文章

网络编程(学习整理)---1--实现简单的控制台聊天室

1.简单的聊天室(控制台): 功能实现: 客户端和服务端的信息交流: 2.牵扯到的知识点: 这个我大概说一下,详细后面见代码! 1) 网络通讯的三要素 1. IP 2. 端口号. 3. 协议   2) InetAddress(IP类) 常用的方法: getLocalHost(); 获取本机的IP地址 getByName("IP或者主机名") 根据一个IP地址的字符串形式或者是一个主机名生成一个IP地址对象. (用于获取别人的IP地址对象) getHostAddress() 返回一个IP

网络编程TCP/IP与UDP实现客户端与客户端聊天

一.TCP/IP协议 既然是网络编程,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,另一个是如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. TCP/IP协议(传输控制协议)由网络层的IP协议和传输层的TCP协议组成.IP层负责网络主机的定位,数据传输的路由,由IP地址可以唯一的确定Internet上的一台主机.TCP层负责面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象. 二.TCP与UDP TCP是一种面向连接的保证可靠传输的协议

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

最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自己理解的东西. 1.首先是对Winsock的一点介绍:Winsock是一种标准的API(应用程序编程接口),主要用于网络中的数据通信,它允许两个应用程序在同一台机器上或通过网络相互通信.需要注意的是Winsock和协议无关,使用Winsock编程接口,应用程序可通过普通网络协议如:TCP/IP(网络

黑马程序员_JAVA UDP网络编程学习笔记

一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的,它们构成了两个端点之间的虚拟通信链路.与TCP通信不同,UDP是面向无连接的.不可靠的基于数据包的传输协议.即应用进程(或程序)在使用UDP协议之前,不必先建立连接.自然,发送数据结束时也没有连接需要释放.因此,减少了开销和发送数据之前的延时.UDP也采用端口来区分进程. 在java中,java.

网络编程学习小结

几种网络编程方式: ISAPI.CGI.WinInet.Winsock 它们之间的差别: 1)  ISAPI主要是开发基于浏览器client与server端程序.效率比CGI方式高,并且也扩展了CGI没有的一些功能.(基于TCP/IP模型中的应用层) 2)  CGI主要是开发基于浏览器client与server端程序.(基于TCP/IP模型中的应用层) 3)  WinInet主要是开发client程序.(基于TCP/IP模型中的应用层) 4)  Winsock主要是基于socket来开发clie

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

网络编程学习笔记一:Socket编程 “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下:

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str

linux网络编程学习笔记之六 -----I/O多路复用服务端

多进程和多线程的目的是在于最大限度地利用CPU资源,当某个进程不需要占用太多CPU资源,而是需要I/O资源时,可以采用I/O多路复用,基本思路是让内核把进程挂起,直到有I/O事件发生时,再把控制返回给程序.这种事件驱动模型的高效之处在于,省去了进程和线程上下文切换的开销.整个程序运行在单一的进程上下文中,所有的逻辑流共享整个进程的地址空间.缺点是,编码复杂,而且随着每个逻辑流并发粒度的减小,编码复杂度会继续上升. I/O多路复用典型应用场合(摘自UNP6.1) select的模型就是这样一个实现

linux网络编程学习笔记之五 -----并发机制与线程?

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我仅仅是举几个样例作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.能够在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理须要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也非常easy,在主线程中定时,定