【问题标题】:messages are concatenated together when received in c#-code-client(finished)在 c#-code-client(finished) 中收到消息时将消息连接在一起
【发布时间】:2014-10-30 02:07:00
【问题描述】:

unity3d中使用c#-client-code从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;
}

【问题讨论】:

    标签: c# multithreading sockets erlang


    【解决方案1】:

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

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

    当然,你必须修改你的 Erlang 客户端,使其在消息之前发送消息大小。

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

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

    【讨论】:

    • 我会改变问题的主题,因为最终它与Unity3d或字体无关。
    猜你喜欢
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 2014-07-17
    • 1970-01-01
    • 2012-09-17
    • 2022-11-10
    相关资源
    最近更新 更多