在c#-code-client(已完成)中收到消息时将它们连接在一起

时间:2014-09-05 07:14:37

标签: c# multithreading sockets erlang

c#-client-code在unity3d中用于从erlang-server-code接收数据,GUI.Label中显示不同的字体权重。 我发送下面的数据一个接一个(我的意思是我发送六次,第一次发送1): 1 22 333 4444 55555 666666。 然后坏事来了:22,333 4444在同一行,4444的字体权重是不同的。有时程序刚刚死亡或崩溃 实际上,我只是不知道如何管理recvMsg线程。 ---------------->感谢

public static TcpClient client=new TcpClient("127.0.0.1",8889);
public   NetworkStream stream=client.GetStream();
void Start () {
    Thread recvMsg=new Thread(new ThreadStart(recvChatRequest));
    recvMsg.Start();
}
void recvChatRequest(){
    while (true) {
        recvChatRequest1();
    }
}
void recvChatRequest1(){
    byte[] recvData=new byte[256];
    int bytes=stream.Read(recvData,0,256);
    string responseData=string.Empty;
    responseData=System.Text.Encoding.UTF8.GetString(recvData,0,bytes);   
    string temp = "\n";
    temp += responseData;
    label_Info += temp;
}

1 个答案:

答案 0 :(得分:0)

TCP是一种流媒体协议。这意味着,如果您在一端发送数据然后尝试接收另一端,则所有消息将连接在一起。这就是为什么你在一行中得到了几个。

您需要定义自己的协议来告诉客户端,消息的开始位置和结束位置。最简单的解决方案是在发送实际数据(例如两个字节)之前添加固定长度的“消息大小”。首先从流中读取2个字节,将其解码为下一个消息的长度(n),然后通过从流中读取n个字节来读取消息本身。

当然,您必须修改Erlang客户端以在消息之前发送消息大小。

另一种方法是使用Erlang External Term Format。在Erlang服务器上,您可以简单地使用term_to_binary,在C#客户端上,您可以解码它。

有一个library, that supports encoding Erlang External Term Format in .NET,但我不认为,它会为你做流斩。