从客户端向服务器发送字节数组?

Raf*_*ari 1 c# client-server tcplistener tcpclient .net-2.0

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

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

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

通讯实例

客户端发送字符串:

Send("CONNECTED| 84.56.32.14")
Run Code Online (Sandbox Code Playgroud)

Server收到一个字符串:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Send("CONNECTED | 15.21.21.32", myByteArray);
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

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

stream.Write(data, 0, data.Length);
Run Code Online (Sandbox Code Playgroud)

但是,您可能需要考虑"框架",即它如何知道每个太阳消息的开始和结束位置.对于字符串,这通常是特殊字符(可能是新行) - 但这在原始二进制文件中很少可能.一种常见的方法是以预定义的方式(可能是网络字节顺序固定的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();
Run Code Online (Sandbox Code Playgroud)