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;
}
答案 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,但我不认为,它会为你做流斩。