我有一个基于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);
答案 0 :(得分:5)
只需使用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();
答案 1 :(得分:0)
由于您似乎对网络不熟悉,因此您可能希望使用WCF或其他框架。我刚刚写了一篇关于我自己的框架的文章:http://blog.gauffin.org/2012/05/griffin-networking-a-somewhat-performant-networking-library-for-net
您需要像Mark建议的那样使用数据包标头,因为TCP使用流而不是数据包。即发送和接收操作之间没有1-1关系。
答案 2 :(得分:0)
这是我遇到的同样的问题。我仅对客户端进行编码,而服务器接受字节数组作为适当的数据。消息以ASCII STX字符开头,后跟一串除STX和ETX字符外的任何值的字节。该消息以ETX ASCII字符结尾。在C语言中,我可以在睡眠中这样做,但是我正在学习C#。我不明白为什么当单字节ASCII码也可以工作时,为什么会发送一堆双字节的unicode。浪费两倍的带宽。