Socket 入坑
什么是Socket
Socket(套接字)是在计算机网络中实现通信的一种机制。它提供了一种应用程序编程接口(API),允许应用程序通过网络进行数据传输和通信。
在网络通信中,Socket 可以被看作是提供网络连接的一种抽象。它可以用于在不同的计算机上的应用程序之间建立双向的通信链路。通过 Socket,应用程序可以发送和接收数据,与其他应用程序进行实时的、可靠的通信。
Socket 位于传输层和应用层之间,负责处理网络的底层细节。它封装了底层的网络协议(如 TCP 或 UDP),提供了一组简单而有效的函数和方法,使得开发者能够方便地使用网络进行通信。

Socket通信模型
使用 Socket 进行通信的一般过程如下:
- 创建 Socket:应用程序通过调用系统提供的函数或类库来创建一个 Socket 实例,指定通信协议、地址和端口等参数。
- 建立连接:对于客户端,它会主动发起连接请求,指定服务器的 IP 地址和端口;对于服务器端,它会监听指定的端口,并在有连接请求时接受连接。
- 数据传输:连接建立成功后,应用程序可以通过 Socket 发送和接收数据。发送数据时,将数据写入 Socket 的输出缓冲区;接收数据时,从 Socket 的输入缓冲区读取数据。
- 断开连接:通信完成后,可以通过关闭 Socket 来断开连接,释放资源。
Socket 提供了不同的通信协议,最常用的是 TCP(传输控制协议)和 UDP(用户数据报协议)。TCP 提供可靠的连接,并确保数据的有序传输;而 UDP 则是一种无连接的协议,只提供数据的不可靠传输。
总结来说,Socket 是一种用于在计算机网络中实现通信的编程接口。它提供了创建连接、发送和接收数据的函数和方法,使得应用程序能够方便地进行网络通信。

消息缓冲区
Socket 消息缓冲区是指 Socket 对象内部用于存放发送和接收数据的缓冲区。消息缓冲区允许应用程序在发送和接收数据时进行数据的缓存和处理,以提高效率和性能。
对于发送数据,应用程序将要发送的数据写入到 Socket 的输出缓冲区中。这些数据并不立即发送到网络,而是在缓冲区中等待适当的发送时机。例如,当缓冲区满了或者应用程序调用了发送数据的方法时,缓冲区中的数据会被发送出去。
对于接收数据,Socket 会将从网络中接收到的数据存放在输入缓冲区中,等待应用程序读取。应用程序可以通过读取输入缓冲区中的数据来获取接收到的消息。如果输入缓冲区为空,应用程序可能会阻塞,直到有新的数据到达。
消息缓冲区的大小可以根据需要进行配置。较小的缓冲区可能会导致频繁的发送和接收操作,而较大的缓冲区可能会增加延迟和内存消耗。因此,在实际应用中,需要根据数据的传输量和性能需求来合理地配置消息缓冲区的大小。
需要注意的是,消息缓冲区只是作为临时存储数据的中介,数据的传输仍然是通过网络进行的。Socket API 提供了相应的方法用于操作消息缓冲区,如发送数据、接收数据和清空缓冲区等。
综上所述,Socket 消息缓冲区是 Socket 对象内部用于存放发送和接收数据的缓冲区,它在数据发送和接收过程中起到缓存和临时存储的作用。

如何理解“套接字”
在计算机编程中,套接字是用于在网络上进行数据传输的编程接口。每个打开的套接字都会被操作系统分配一个唯一的套接字句柄,也就是 fd。这个句柄可以看作是对打开套接字的引用,通过它可以进行读取、写入、关闭等操作。
入门demo
服务端
//1 创建Socket对象
socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2 绑定ip和端口
IPAddress ip = IPAddress.Parse("127.0.0.1");
IPEndPoint ipEndPoint = new IPEndPoint(ip, 50001);
socketServer.Bind(ipEndPoint);
//3、开启侦听(等待客户机发出的连接),并设置最大客户端连接数为10
socketServer.Listen(10);
//4、【阻塞】,等待客户端连接
Socket newSocket = socketServer.Accept();
//5、【阻塞】,等待读取客户端发送过来的数据
byte[] data = new byte[1024 * 1024];
int readLeng = newSocket.Receive(data, 0, data.Length, SocketFlags.None);
//6、读取数据
var msg = Encoding.UTF8.GetString(data, 0, readLeng);
客服端
//1 创建Socket对象
socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2 连接到服务端
IPAddress ip = IPAddress.Parse("127.0.0.1");
IPEndPoint ipEndPoint = new IPEndPoint(ip, 50001);
socketClient.Connect(ipEndPoint);
//3 发送消息到服务端
socketClient.Send(Encoding.UTF8.GetBytes("hello,word"));
不过,这里有个很大的问题,服务端只能建立一个客户端连接和接受一次客户端发来的消息。如果想要连接更多的客户端和接受无数次的消息,服务端代码两处阻塞的地方需要另外开一个线程然后包到循环里面去。
修改后的服务端代码如下:
void .... ()
{
//1 创建Socket对象
socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2 绑定ip和端口
IPAddress ip = IPAddress.Parse("127.0.0.1");
IPEndPoint ipEndPoint = new IPEndPoint(ip, 50001);
socketServer.Bind(ipEndPoint);
//3、开启侦听(等待客户机发出的连接),并设置最大客户端连接数为10
socketServer.Listen(10);
//开启新的线程,循环等待新的客户端连接
Task.Run(() => { Accept(socketServer); });
}
void Accept(Socket socket)
{
while (true)
{
//4、【阻塞】,等待客户端连接
Socket newSocket = socket.Accept();
//开启新的线程,循环等待接收新的数据
Task.Run(() => { Receive(newSocket); });
}
}
void Receive(Socket newSocket)
{
while (true)
{
//5、【阻塞】,等待读取客户端发送过来的数据
byte[] data = new byte[1024 * 1024];
int readLeng = newSocket.Receive(data, 0, data.Length, SocketFlags.None);
//6、读取数据
var msg = Encoding.UTF8.GetString(data, 0, readLeng);
}
}
参考
【农码一生】
https://www.cnblogs.com/zhaopei/p/Socket1.html
Socket 入坑的更多相关文章
- webpack入坑之旅(四)扬帆起航
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
- 写给正在入坑linux系统的伙伴
光阴似箭,时光如梭,转年出来工作已经3年了.从一个职场新人慢慢熟悉职场的工作方式,适应职场工作的环境,学习了很多知识,也总结了很多经验.现在的目标就是一步一个脚印,慢慢打磨自己,希望早日成为取代其他人 ...
- RoboGuice 3.0 (一)入坑篇
RoboGuice是什么? 一个Android上的依赖注入框架. 依赖注入是什么? 从字面理解,这个框架做了两件事情,第一是去除依赖,第二是注入依赖.简单理解就是,将对象的初始化委托给一个容器控制器, ...
- [SSIS] 在脚本里面使用数据库连接字符串进行查询等处理, 入坑
入坑.!!!!! SSIS 中dts包 设置的 ADO.Net连接, 在传入脚本的时候, 我要使用 数据库连接,进行数据的删除操作. 于是我使用了 了如下的 代码 使用的是windows 身份验证, ...
- webpack入坑之旅(六)配合vue-router实现SPA
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
- webpack入坑之旅(五)加载vue单文件组件
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
- webpack入坑之旅(三)webpack.config入门
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
- webpack入坑之旅(二)loader入门
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack 在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
- webpack入坑之旅(一)不是开始的开始
最近学习框架,选择了vue,然后接触到了vue中的单文件组件,官方推荐使用 Webpack + vue-loader构建这些单文件 Vue 组件,于是就开始了webpack的入坑之旅.因为原来没有用过 ...
- gulp入坑系列(2)——初试JS代码合并与压缩
在上一篇里成功安装了gulp到项目中,现在来测试一下gulp的合并与压缩功能 gulp入坑系列(1)--安装gulp(传送门):http://www.cnblogs.com/YuuyaRin/p/61 ...
随机推荐
- dataX源码学习
文章目录 前言 开始准备 运行配置 开始运行 JobContainer 1.进入init prepare schedule post阶段 this.invokeHooks(); 总结 前言 在用dat ...
- Python网页应用开发神器fac 0.2.6版本重要新功能一览
fac项目地址:https://github.com/CNFeffery/feffery-antd-components ,欢迎star支持 大家好我是费老师,距离我的开源Python网页应用通用组件 ...
- 「学习笔记」AC 自动机
「学习笔记」AC 自动机 点击查看目录 目录 「学习笔记」AC 自动机 算法 问题 思路 代码 例题 Keywords Search 玄武密码 单词 病毒 最短母串 文本生成器 背单词 密码 禁忌 前 ...
- Linux下七种文件类型、文件属性及其查看方法
1.七种文件类型 普通文件类型 Linux中最多的一种文件类型, 包括 纯文本文件(ASCII):二进制文件(binary):数据格式的文件(data);各种压缩文件.第一个属性为 [-] 目录文件 ...
- KaiOS 2.5.X 使用 WebIDE 安装以及调试第三方应用程序
本教程将展示使用 Waterfox Classic 安装为 KaiOS 2.5.x 设计的应用,同时我们也非常推荐使用它来进行安装和调试应用. 本教程本身不会对手机产生任何损害,但请注意,你必须信任你 ...
- MAUI开发Android程序使PDA扫码广播消息转发至Web页面
前言 公司系统的手持终端(PDA)是用的Vue写的前端代码 在PDA上用浏览器直接打开Web页面 PDA扫码的时候,输出模式直接用模拟键盘按键的方式输出 这样在Web页面上,如果一个输入框在当前有焦点 ...
- I2C总线 | I2C总线介绍
I2C总线 | I2C总线介绍 目录 I2C总线 | I2C总线介绍 I2C总线介绍 I2C有如下特点: I2C总线术语 I2C总线位传输 IIC总线数据传输 1.字节格式 2.应答响应 IIC总线寻 ...
- Grafana系列-统一展示-7-ElasticSearch数据源
系列文章 Grafana 系列文章 ElasticSearch 数据源 Grafana内置了对Elasticsearch的支持.你可以进行多种类型的查询,以可视化存储在Elasticsearch中的日 ...
- 微信小程序客服、支付、定位、下拉加载功能
一.客服功能 1.只要你微信小程序,后台添加了客服,引用以下button,就可以进入聊天(在小程序官网如何添加客服用户,请自行百度,谢谢) 2.通过按钮方式 <button open-type= ...
- requests标头在json序列化时报错TypeError: Object of type CaseInsensitiveDict is not JSON serializable
requests的作者似乎为了解决header里大小写兼容的问题,而创建了大小写不敏感的数据结构CaseInsensitiveDict,requests返回的响应标头即是一个CaseInsensiti ...