VB.NET中Socket编程
VB.NET中Socket编程
- 写在之前
- Socket是什么?
- Socket套接字的类型
- 流格式套接字(STREAM)
- SOCK_STREAM 有以下几个特征:
- 为什么流格式套接字可以达到高质量的数据传输?**
- 面向连接
- 常见应用
- 数据报格式套接字
- SOCK_DGRAM 有以下几个特征:
- SOCK_DGRAM 特性的原因:
- 常见应用
- 未完待续
写在之前
次分享是基于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 比喻成高速移动的摩托车快递,它有以下特征:
- 强调快速传输而非传输顺序;
- 传输的数据可能丢失也可能损毁;
- 限制每次传输的数据大小;
- 数据的发送和接收是同步的(有的教程也称“存在数据边界”)。
SOCK_DGRAM 特性的原因:
众所周知,速度是快递行业的生命。用摩托车发往同一地点的两件包裹无需保证顺序,只要以最快的速度交给客户就行。这种方式存在损坏或丢失的风险,而且包裹大小有一定限制。因此,想要传递大量包裹,就得分配发送。
将无连接套接字比喻成摩托车快递
另外,用两辆摩托车分别发送两件包裹,那么接收者也需要分两次接收,所以“数据的发送和接收是同步的”;换句话说,接收次数应该和发送次数相同。
总之,数据报套接字是一种不可靠的、不按顺序传递的、以追求速度为目的的套接字。
数据报套接字也使用 IP 协议作路由,但是它不使用 TCP 协议,而是使用 UDP 协议(User Datagram Protocol,用户数据报协议)。
常见应用
QQ视频和语音聊天
未完待续
VB.NET中Socket编程相关推荐
- Python中Socket编程
目录 Python中Socket编程 1 一.Socket概述 1 二.python中socket模块使用 1 三.socket之聊天室 3 四.socket之端口探测 7 五.scapy之tcp端口 ...
- android c++ socket编程,C++ 中 socket编程实例详解
C++ 中 socket编程实例详解 sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW):基于TCP的soc ...
- [转]vc中socket编程步骤
sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW):基于TCP的socket编程是采用的流式套接字.在这个程 ...
- C++中socket编程
摘自:http://www.cnblogs.com/Sniper-quay/archive/2011/06/22/2086636.html sockets(套接字)编程有三种,流式套接字(SOCK_S ...
- java中socket编程实例_Java中socket编程的实现过程(代码实例)
本篇文章给大家带来的内容是关于socket编程的实现过程,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.socket 服务器搭建 实例化socket服务器,循环获取请求packa ...
- qt中socket编程
1 文章概括 在qt中借助designer设计通信界面,然后使用QTcpServer,QTcpSocket编写服务器和客户端的程序. 首先建立两个工程,一个是客户端client,另一个是服务器端ser ...
- linux咋socket编程,linux中socket编程
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 客户端:include #include #include #include #include #include #include #include #i ...
- linux中的socket编程,linux中socket编程
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 客户端:include #include #include #include #include #include #include #include #i ...
- C#中socket编程中文乱码
Encoding.ASCII.GetString(bytes, 0, bytesRec);这个是ASCII码转换,如果是中文就出错, 所以解决办法改为Encoding.UTF8.GetString(b ...
- Linux中的socket编程
目录 0.前言 1.Linux中socket编程接口详解 1.1.socket函数 1.2.bind函数 为什么addr参数要使用sockaddr_in 结构体,然后再强制转换为 sockaddr 类 ...
最新文章
- php要用到哪些软件吗,php开发需要用什么程序
- CCNP-2 EIGRP试验2(BSCI)
- TinyDBCluster Vs routing4db
- Python3--批量爬取数据之调金山词霸api进行翻译
- 攻防世界base除4_CCTV5周末看点:周六!女足世界杯1/4决赛连战三场;周日!中超15轮国安碰鲁能...
- 学习笔记-----C++模板类中友元函数重载输出运算符时提示无法解析的外部符号解决方案
- iview中时间选择器可设置选择范围方法(一个月 一周等)
- 使用Vue写一个登陆页面并在管理页面查看和修改
- python rpc_对python调用RPC接口的实例详解
- 老牌语言依然强势,GO、Kotlin 等新语言为何不能破局?
- arm平台函数传递参数,反汇编实例分析
- 黑马程序员全套Java教程_Java基础入门视频教程零基础自学Java必备教程视频讲义(2)
- tomcat常见漏洞
- 常用邮箱SMTP服务器地址大全
- CMYK,RGB颜色对照表
- 抓取B站所有用户信息(11/29更新数据)
- Android发送通知
- Visual Studio 报错:未能加载工具箱项,将从项目中移除
- java bean 首字母大写_javaBean命名规范 get / set 后的首字母大写
- linux monitor 命令,Process Monitor(简称Procmon)发布Linux版,附使用方法