【问题标题】:Sending Array of Bytes from Client to server?将字节数组从客户端发送到服务器?
【发布时间】:2012-05-14 22:28:30
【问题描述】:

我有一个基于 tcp 的客户端-服务器应用程序。我能够发送和接收字符串,但不知道如何发送字节数组。

我正在使用以下函数将字符串从客户端发送到服务器:

static void Send(string msg)
{
    try
    {
        StreamWriter writer = new StreamWriter(client.GetStream());
        writer.WriteLine(msg);
        writer.Flush();
    }
    catch
    {
    }
}

通信示例

客户端发送一个字符串:

Send("CONNECTED| 84.56.32.14")

服务器收到一个字符串:

void clientConnection_ReceivedEvent(Connection client, String Message)
{
    string[] cut = Message.Split('|');
    switch (cut[0])
    {
        case "CONNECTED":
            Invoke(new _AddClient(AddClient), client, null);
            break;
        case "STATUS":
            Invoke(new _Status(Status), client, cut[1]);
            break;
    }
}

我需要一些帮助来修改上面的函数,以便发送和接收字节数组以及字符串。我想这样打电话:

Send("CONNECTED | 15.21.21.32", myByteArray);

【问题讨论】:

  • 一个空的 catch 块总是是一个相当糟糕的主意。

标签: c# .net-2.0 client-server tcpclient tcplistener


【解决方案1】:

只需使用 Stream - 这里不需要作家。基本发送很简单:

stream.Write(data, 0, data.Length);

但是您可能需要考虑“框架”,即它如何知道每个太阳消息的开始和结束位置。对于字符串,这通常是特殊字符(可能是新行)——但这在原始二进制文件中很少可能发生。一种常见的方法是以预定义的方式(例如,可能是网络字节顺序固定的 4 字节无符号整数)处理带有 f 个字节数的消息。

Reading:再次使用 Stream Read 方法,但要明白总是需要检查返回值;仅仅因为你说“最多读取 20 个字节”并不意味着你得到了那么多,即使会有更多 - 例如,你可以读取 3、3、3、11 个字节(不太可能,但你明白我的意思)。例如,要准确读取 20 个字节:

var buffer = new byte[...];
int count = 20, read, offset = 0;
while(count > 0 && ((read = source.Read(buffer, offset, count)) > 0) {
    offset += read;
    count -= read;
}
if(count != 0) throw new EndOfStreamException();

【讨论】:

    【解决方案2】:

    由于您似乎是网络新手,您可能希望使用 WCF 或其他框架。我刚刚写了一篇关于我自己的框架的文章:http://blog.gauffin.org/2012/05/griffin-networking-a-somewhat-performant-networking-library-for-net

    您需要按照 Mark 的建议为数据包使用标头,因为 TCP 使用流而不是数据包。即发送和接收操作之间没有 1-1 的关系。

    【讨论】:

      【解决方案3】:

      这与我遇到的问题相同。我只对客户端进行编码,服务器接受字节数组作为正确的数据。消息以 ASCII STX 字符开头,前面是一堆除 STX 和 ETX 字符外的任何值的字节。消息以 ETX ASCII CHARACTER 结尾。在 C 中,我可以在睡梦中做到这一点,但我在工作中学习 C#。我不明白为什么当单字节 ASCII 代码也能正常工作时,你会发送成串的双字节 unicode。浪费双倍带宽。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-11
        • 2021-12-07
        • 1970-01-01
        相关资源
        最近更新 更多