C#中的客户端套接字

Posted

技术标签:

【中文标题】C#中的客户端套接字【英文标题】:Client Socket in C# 【发布时间】:2021-11-14 05:42:50 【问题描述】:

我无法从套接字获取数据。这是客户端(下图),其中“_sender”是套接字。我想要的是有一个与从服务器接收到的字节大小相同的缓冲区(我不知道先验)。所以我要做的是通过“可用”语句检查套接字(“_sender”)准备从服务器接收多少字节。 你觉得这个推理对吗?

byte[] bufferRec = new byte[0]; 
        int bytesAvailable = 0;
        int offset = 0;

        System.Console.WriteLine(_sender.Available);
        
        while (_sender.Available != 0)
        
            bytesAvailable = _sender.Available; 
            Array.Resize(ref bufferRec, bufferRec.Length + bytesAvailable); 
            int read = _sender.Receive(bufferRec, offset, bytesAvailable, SocketFlags.None); 
            offset += read;
        

【问题讨论】:

您的实际问题是什么? 如果这是一个 TCP 套接字,那么你需要在它上面使用一些协议,因此你必须事先知道你需要读取多少字节,然后读取直到你读取了那么多字节。例如,您可以在“消息”前面加上其长度(以字节为单位),并使用前 2 或 4 个字节发送该长度。然后接收者首先准确地读取 2(4) 个字节,现在它知道消息的长度并且它读取了那么多。 【参考方案1】:

套接字是一个连续的字节流。仅当另一端停止发送时,流才会停止。

将流想象成磁盘上的二进制文件,您需要了解该二进制文件是如何“成帧”的,您需要知道位和字节在哪里开始和停止。

例如,

Byte[0..3]             = MessageID
Byte[4..5]             = MessageSize in Bytes
Byte[6..6+MessageSize] = Payload

现在您将读取字节 0-5,然后提取有效负载,获取消息大小并从流中读取有效负载。然后你会重复那个。

当然,您还需要错误处理,如果流在提取有效负载之前结束会发生什么,如果服务器离线,可能会发生这种情况。这类似于磁盘上的文件被损坏和简短。

【讨论】:

以上是关于C#中的客户端套接字的主要内容,如果未能解决你的问题,请参考以下文章

c# Windows Phone 7 中的 Facebook 聊天客户端

C# 客户端 - 服务器套接字断开处理

C# Windows 应用程序从流套接字读取数据不可理解

C#异步套接字服务器没有收到来自Java客户端的响应

TCP Socket在C#中接收数据错误

交叉编译的 c# 套接字程序,适用于 win,但不适用于 mac