【问题标题】:How to detect an end of byte[] message send through socket如何检测通过套接字发送的字节 [] 消息结束
【发布时间】:2015-09-08 02:24:44
【问题描述】:

假设_sslStream 是在客户端建立的SslStream 连接。

private void DoStuff(string message)
{
   _streamWriter = new StreamWriter(_sslStream) { AutoFlush = true };
   _streamWriter.Write(GetGzipBytes("hello world"));
}

private static byte[] GetGzipBytes(string message)
{
    //Not a final implementation. Cannot add string "<EOF>" mark
    return Encoding.UTF8.GetBytes(message);
}

如何在服务器端检测接收到的字节是否完整?

是否有一些推荐的“字节数组结束”标记我应该添加到数组的末尾?

我如何确保GetGzipBytes() 方法不会产生byte[] 会在消息中包含这些字节?

如果是字符串,我会调用:

_streamReader.ReadLine();

【问题讨论】:

    标签: c# sockets


    【解决方案1】:

    对于二进制消息,没有办法做到这一点。您需要预先知道传输的字节数,或者您需要添加一个已定义的消息结束指示符。

    【讨论】:

    • 要稍微扩展这个答案,您有两个选择。一种是将其制成消息,例如,您首先发送字节数,然后发送 Zip 字节。另一种是使用Close关闭流;当然,使用第二种方法,每个连接不能发送多个“消息”。
    【解决方案2】:

    只需调用 _streamWriter.End() - 它将结束当前网络流并发送到客户端。就是这样。

    请注意 - 它不会传入您的代码示例,因为您的流不是网络流。

    您可以使用 _stream.BinaryWrite(byteArray) 写入字节数组。对于网络流。

    【讨论】:

    • StreamWriter 类上没有方法 .End()
    • 您的意思可能是Close 方法。
    • @VojtechB 我的意思是 End() 或 Close() 方法,以防使用 NETWORK STREAM,而不仅仅是 StreamWriter。我之前已经提到过这一点。示例: Response.BinaryWrite(bytearray); Response.Close();
    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多