c# - 从客户端发送字节数组到服务器?

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

我有一个基于 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);

最佳答案

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

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

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

读取:再次使用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();

关于c# - 从客户端发送字节数组到服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10464726/

相关文章:

c# - 使用现有控件向窗体添加选项卡控件

Java TCP 服务器-客户端设计方案

Node.js VS。用于简单客户端应用程序的 JavaFX(从服务器打印出消息)

c# - 在 Web 应用程序中设置 WCF TCP 服务

c# - 有没有办法在 c# 谓词中进行这种转换

c# - 首次在.NET项目中设置AutoMapper(6.2.2)

c# - 如何允许服务器同时接受 SSL 和纯文本(不安全)连接?

c# - Xamarin Forms - Webview 未显示

c# - 如果在调用方法时创建画笔,是否会处理画笔

c# - 使用 .NET 2.0,如何通过 FTP 连接到服务器、获取文件和删除文件?