您的问题似乎不完整,您是想询问关于C语言编程的某个具体问题吗?比如C语言的语法、编程技巧、项目开发等。请提供更具体的信息,这样我才能给出更准确的回答。
- 内容介绍
- 文章标签
- 相关推荐
本文共计888个文字,预计阅读时间需要4分钟。
Stream.Read方法在派生类中重写时,用于从当前流中读取字节序列,并将读取的位置提升。语法:public abstract int Read(byte[] buffer, int offset, int count)。参数:buffer:字节数组。此方法将填充buffer数组,从offset开始,最多count个字节。此方法返回实际读取的字节数。
Stream.Read 方法
当在派生类中重写时,从当前流读取字节序列,并将此流中的位置提升读取的字节数。
语法:
public abstract intRead(byte[] buffer,intoffset,intcount)
参数:
- 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(() => {}); 这个可以去掉;
到此这篇关于C# Socket数据接收的三种实现方式的文章就介绍到这了,更多相关C# Socket数据接收内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!
本文共计888个文字,预计阅读时间需要4分钟。
Stream.Read方法在派生类中重写时,用于从当前流中读取字节序列,并将读取的位置提升。语法:public abstract int Read(byte[] buffer, int offset, int count)。参数:buffer:字节数组。此方法将填充buffer数组,从offset开始,最多count个字节。此方法返回实际读取的字节数。
Stream.Read 方法
当在派生类中重写时,从当前流读取字节序列,并将此流中的位置提升读取的字节数。
语法:
public abstract intRead(byte[] buffer,intoffset,intcount)
参数:
- 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(() => {}); 这个可以去掉;
到此这篇关于C# Socket数据接收的三种实现方式的文章就介绍到这了,更多相关C# Socket数据接收内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

