当前位置:网站首页>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(() => {}); 这个可以去掉;
边栏推荐
- Force deduction question 500, keyboard line, JS implementation
- Classification, function and usage of MySQL constraints
- 重磅新闻 | Softing FG-200获得中国3C防爆认证 为客户现场测试提供安全保障
- Management background --5, sub classification
- const关键字
- (18) LCD1602 experiment
- LeetCode刷题(十一)——顺序刷题51至55
- SQL Server生成自增序号
- signed、unsigned关键字
- Aardio - 利用customPlus库+plus构造一个多按钮组件
猜你喜欢
Assembly and Interface Technology Experiment 6 - ADDA conversion experiment, AD acquisition system in interrupt mode
Advantages of link local address in IPv6
基於 QEMUv8 搭建 OP-TEE 開發環境
Chapter 3: detailed explanation of class loading process (class life cycle)
3DMax指定面贴图
Attack and defense world miscall
[leetcode daily clock in] 1020 Number of enclaves
Management background --5, sub classification
Netxpert xg2 helps you solve the problem of "Cabling installation and maintenance"
Management background --3, modify classification
随机推荐
网络基础入门理解
[Digital IC hand tearing code] Verilog burr free clock switching circuit | topic | principle | design | simulation
[sdx62] wcn685x will bdwlan Bin and bdwlan Txt mutual conversion operation method
Web APIs DOM 时间对象
CCNA-思科网络 EIGRP协议
在IPv6中 链路本地地址的优势
How do I write Flask's excellent debug log message to a file in production?
Inno setup packaging and signing Guide
中国1,4-环己烷二甲醇(CHDM)行业调研与投资决策报告(2022版)
Chapter 3: detailed explanation of class loading process (class life cycle)
Unity3D学习笔记6——GPU实例化(1)
return 关键字
case 关键字后面的值有什么要求吗?
Dealing with the crash of QT quick project in offscreen mode
Learn the principle of database kernel from Oracle log parsing
Pit encountered by handwritten ABA
Inno Setup 打包及签名指南
extern关键字
The nearest common ancestor of binary (search) tree ●●
Web APIs DOM time object