您的位置:首页 > 编程语言 > VB

VB.NET中Socket编程

2020-03-05 04:30 876 查看

VB.NET中Socket编程

  • 数据报格式套接字
  • 未完待续
  • 写在之前

    次分享是基于http://c.biancheng.net网站中“socket编程“教程提炼的分享,若有侵权,请联系删除,若想查看原帖,请移步http://c.biancheng.net/socket/。同时原网站使用的C语言,本人将其转化为所用的VB.NET分享,与大家共同进步

    Socket是什么?

    Socket在网络通信中被称为套接字:在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接
    收其他计算机的数据,也可以向其他计算机发送数据。

    socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的 URL,向服务器发起请求,服务器分析接收到的 URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户。

    Socket套接字的类型

    有很多种套接字(socket),比如 DARPA Internet 地址(Internet 套接字)、本地节点的路径名(Unix套接字)、CCITT X.25地址(X.25 套接字)等,在此只介绍Internet套接字。根据数据的传输方式,可以将 Internet 套接字分成各种类型,在此只介绍常用的两种,即流格式套接字和数据报格式套接字

    流格式套接字(STREAM)

    流格式套接字(Stream Sockets)也叫“面向连接的套接字”,

    在代码中使用 SOCK_STREAM 表示。

    SOCK_STREAM 是一种可靠的、双向的通信数据流,数据可以准确无误地到达另一台计算机,如果损坏或丢失,可以重新发送。

    SOCK_STREAM 有以下几个特征:

    1. 数据在传输过程中不会消失;
    可以将 SOCK_STREAM 比喻成一条传送带,只要传送带本身没有问题(不会断网),就能保证数据不丢失;
    2. 数据是按照顺序传输的;
    同时,较晚传送的数据不会先到达,较早传送的数据不会晚到达,这就保证了数据是按照顺序传递的。
    3. 数据的发送和接收不是同步的(有的教程也称“不存在数据边界”)
    流格式套接字的内部有一个缓冲区(也就是字符数组),通过 socket 传输的数据将保存到这个缓冲区。接收端在收到数据后并不一定立即读取,只要数据不超过缓冲区的容量,接收端有可能在缓冲区被填满以后一次性地读取,也可能分成好几次读取。

    也就是说,不管数据分几次传送过来,接收端只需要根据自己的要求读取,不用非得在数据到达时立即读取。传送端有自己的节奏,接收端也有自己的节奏,它们是不一致的。

    为什么流格式套接字可以达到高质量的数据传输?**

    因为它使用了 TCP 协议(The Transmission Control Protocol,传输控制协议),TCP 协议会控制你的数据按照顺序到达并且没有错误。

    你也许见过 TCP,是因为你经常听说“TCP/IP”。TCP 用来确保数据的正确性,IP(Internet Protocol,网络协议)用来控制数据如何从源头到达目的地,也就是常说的“路由”。

    面向连接


    面向连接的套接字在正式通信之前要先确定一条路径,没有特殊情况的话,以后就固定地使用这条路径来传递数据包了。当然,路径被破坏的话,比如某个路由器断电了,那么会重新建立路径。

    这条路径是由路由器维护的,路径上的所有路由器都要存储该路径的信息(实际上只需要存储上游和下游的两个路由器的位置就行),所以路由器是有开销的。

    H1 和 H6 通信完毕后,要断开连接,销毁路径,这个时候路由器也会把之前存储的路径信息擦除。

    在很多网络通信教程中,这条预先建立好的路径被称为“虚电路”,就是一条虚拟的通信电路。

    为了保证数据包准确、顺序地到达,发送端在发送数据包以后,必须得到接收端的确认才发送下一个数据包;如果数据包发出去了,一段时间以后仍然没有得到接收端的回应,那么发送端会重新再发送一次,直到得到接收端的回应。这样一来,发送端发送的所有数据包都能到达接收端,并且是按照顺序到达的。
    发送端发送一个数据包,如何得到接收端的确认呢?很简单,为每一个数据包分配一个 ID,接收端接收到数据包以后,再给发送端返回一个数据包,告诉发送端我接收到了 ID 为 xxx 的数据包。
    面向连接的套接字会比无连接的套接字多出很多数据包,因为发送端每发送一个数据包,接收端就会返回一个数据包。此外,建立连接和断开连接的过程也会传递很多数据包。

    不但是数量多了,每个数据包也变大了:除了源端口和目的端口,面向连接的套接字还包括序号、确认信号、数据偏移、控制标志(通常说的 URG、ACK、PSH、RST、SYN、FIN)、窗口、校验和、紧急指针、选项等信息;而无连接的套接字则只包含长度和校验和信息。

    有连接的数据包比无连接大很多,这意味着更大的负载和更大的带宽。许多即时聊天软件采用 UDP 协议(无连接套接字),与此有莫大的关系。

    常见应用

    浏览器所使用的 http 协议就基于面向连接的套接字,因为必须要确保数据准确无误,否则加载的 HTML 将无法解析

    数据报格式套接字

    数据报格式套接字(Datagram Sockets)也叫“无连接的套接字”,在代码中使用 SOCK_DGRAM 表示。

    计算机只管传输数据,不作数据校验,如果数据在传输中损坏,或者没有到达另一台计算机,是没有办法补救的。也就是说,数据错了就错了,无法重传。

    因为数据报套接字所做的校验工作少,所以在传输效率方面比流格式套接字要高。

    SOCK_DGRAM 有以下几个特征:

    可以将 SOCK_DGRAM 比喻成高速移动的摩托车快递,它有以下特征:

    1. 强调快速传输而非传输顺序;
    2. 传输的数据可能丢失也可能损毁;
    3. 限制每次传输的数据大小;
    4. 数据的发送和接收是同步的(有的教程也称“存在数据边界”)。

    SOCK_DGRAM 特性的原因:

    众所周知,速度是快递行业的生命。用摩托车发往同一地点的两件包裹无需保证顺序,只要以最快的速度交给客户就行。这种方式存在损坏或丢失的风险,而且包裹大小有一定限制。因此,想要传递大量包裹,就得分配发送。

    将无连接套接字比喻成摩托车快递

    另外,用两辆摩托车分别发送两件包裹,那么接收者也需要分两次接收,所以“数据的发送和接收是同步的”;换句话说,接收次数应该和发送次数相同。

    总之,数据报套接字是一种不可靠的、不按顺序传递的、以追求速度为目的的套接字。

    数据报套接字也使用 IP 协议作路由,但是它不使用 TCP 协议,而是使用 UDP 协议(User Datagram Protocol,用户数据报协议)。

    常见应用

    QQ视频和语音聊天

    未完待续

    • 点赞
    • 收藏
    • 分享
    • 文章举报
    元芳(寻找失迷的羊) 发布了0 篇原创文章 · 获赞 0 · 访问量 52 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: