当前位置:网站首页>C# 三种方式实现Socket数据接收
C# 三种方式实现Socket数据接收
2022-07-06 14:48:00 【Phil Arist】
Stream.Read 方法
当在派生类中重写时,从当前流读取字节序列,并将此流中的位置提升读取的字节数。
语法:
public abstract int Read(byte[] buffer, int offset, int count)
参数:
buffer: 字节数组。此方法返回时,该缓冲区包含指定的字符数组,该数组的 offset 和 (offset + count -1) 之间的值由从当前源中读取的字节替换。
offset: buffer 中的从零开始的字节偏移量,从此处开始存储从当前流中读取的数据。
count: 要从当前流中最多读取的字节数。
返回值:
读入缓冲区中的总字节数。如果当前可用的字节数没有请求的字节数那么多,则总字节数可能小于请求的字节数,或者如果已到达流的末尾,则为零 (0)。
备注:
此方法的实现从当前流中读取最多的 count 个字节,并将它们存储在从 offset 开始的 buffer 中。流中的当前位置提升已读取的字节数;但是,如果出现异常,流中的当前位置保持不变。实现返回已读取的字节数。仅当位置当前位于流的末尾时,返回值才为零。如果没有任何可用的数据,该实现将一直阻塞到至少有一个字节的数据可读为止。仅当流中不再有其他的数据,而且也不再需要更多的数据(如已关闭的套接字或文件尾)时,Read 才返回 0。即使尚未到达流的末尾,实现仍可以随意返回少于所请求的字节。
之前一般采用如下方式进行数据接收:
int recv;//定义接收数据长度变量
IPEndPoint ipEnd = new IPEndPoint(IPAddress.Parse(textBox1.Text), int.Parse(textBox2.Text));
//接收端所监听的接口,ip也可以用IPAddress.Any
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//初始化一个Socket对象
socket.Bind(ipEnd);//绑定套接字到一个IP地址和一个端口上(bind());
socket.Listen(10);
while (true)
{
byte[] data = new byte[1024];//对data清零
Socket clientSocket = socket.Accept(); //一旦接受连接,创建一个客户端
recv = clientSocket.Receive(data);
if (recv == 0) //如果收到的数据长度小于0,则退出
break;
string stringData = "0x" + BitConverter.ToString(data).Replace("-", " 0x").ToLower();
this.Invoke((EventHandler)delegate
{
richTextBox1.Text += DateTime.Now.ToString("yy-MM-dd hh:mm:ss") + stringData + "\n";
});
}之前用的时候没发现什么问题,但是今天在测试金属门数据接收的时候发现会丢数据,金属门每隔十秒给我一次数据,用上面这个差不多60秒才能收到一组数据,针对以上问题,做了如下修改:
将数据接收放到 while (true),数据接收正常。
以下分别采用三种方式实现了数据的正常接收,代码如下:

测试:
Task.Run(() => {}); 这个可以去掉;
边栏推荐
- Anaconda installs third-party packages
- 3DMax指定面贴图
- return 关键字
- China 1,4-cyclohexanedimethanol (CHDM) industry research and investment decision-making report (2022 Edition)
- 第4章:再谈类的加载器
- 基于 QEMUv8 搭建 OP-TEE 开发环境
- Force deduction question 500, keyboard line, JS implementation
- Classification, function and usage of MySQL constraints
- 中国固态氧化物燃料电池技术进展与发展前景报告(2022版)
- Spatial domain and frequency domain image compression of images
猜你喜欢

重磅新闻 | Softing FG-200获得中国3C防爆认证 为客户现场测试提供安全保障

Oracle-控制文件及日志文件的管理

Spatial domain and frequency domain image compression of images

硬件开发笔记(十): 硬件开发基本流程,制作一个USB转RS232的模块(九):创建CH340G/MAX232封装库sop-16并关联原理图元器件

MySQL----初识MySQL
![[leetcode daily clock in] 1020 Number of enclaves](/img/2d/3d12f20c8c73fb28044c01be633c99.jpg)
[leetcode daily clock in] 1020 Number of enclaves

基於 QEMUv8 搭建 OP-TEE 開發環境

Management background --2 Classification list

C # réalise la liaison des données du rapport Crystal et l'impression du Code à barres 4

ResNet-RS:谷歌领衔调优ResNet,性能全面超越EfficientNet系列 | 2021 arxiv
随机推荐
Dealing with the crash of QT quick project in offscreen mode
2022年6月国产数据库大事记-墨天轮
Aardio - 利用customPlus库+plus构造一个多按钮组件
2021 geometry deep learning master Michael Bronstein long article analysis
LeetCode刷题(十一)——顺序刷题51至55
GPS from getting started to giving up (12), Doppler constant speed
Hardware development notes (10): basic process of hardware development, making a USB to RS232 module (9): create ch340g/max232 package library sop-16 and associate principle primitive devices
HDR image reconstruction from a single exposure using deep CNNs阅读札记
volatile关键字
柔性数组到底如何使用呢?
【sdx62】WCN685X将bdwlan.bin和bdwlan.txt相互转化操作方法
做接口测试都测什么?有哪些通用测试点?
Solve project cross domain problems
MySQL----初识MySQL
墨西哥一架飞往美国的客机起飞后遭雷击 随后安全返航
i. Mx6ull build boa server details and some of the problems encountered
anaconda安装第三方包
自制J-Flash烧录工具——Qt调用jlinkARM.dll方式
ResNet-RS:谷歌领衔调优ResNet,性能全面超越EfficientNet系列 | 2021 arxiv
在IPv6中 链路本地地址的优势