C#分离TCP消息

C#分离TCP消息,c#,tcp,server,client,messagebox,C#,Tcp,Server,Client,Messagebox,我正在使用TCP客户机/服务器系统进行练习,我想在两者之间发送特定数据 我已经能够发送字节并让它们显示为字符串。我还可以发送一个特定的字符串(“mb”),并在服务器端弹出一个MessageBox 框的内容是发送的文本(在本例中为“mb”) 这是服务器端: byte[] msg = new byte[4096]; var count = stream.Read(msg, 0, msg.Length); string returnData = Encoding.ASCII.GetString(ms

我正在使用TCP客户机/服务器系统进行练习,我想在两者之间发送特定数据

我已经能够发送字节并让它们显示为字符串。我还可以发送一个特定的字符串(“mb”),并在服务器端弹出一个MessageBox

框的内容是发送的文本(在本例中为“mb”)

这是服务器端:

byte[] msg = new byte[4096];

var count = stream.Read(msg, 0, msg.Length);
string returnData = Encoding.ASCII.GetString(msg, 0, count);

switch(returnData)
{
    case "mb":                            
        MessageBox((IntPtr)0, returnData, "HACKERZ", 0);
             break;
    case "":                            
            client.Client.Disconnect(true);                        
        Console.WriteLine("User disconnected");
             break;
    default:
        Console.WriteLine(returnData);
             break;
}      
这是客户端:

private void btnSend_Click(object sender, EventArgs e)
{
    NetworkStream stream = client.GetStream();

    byte[] msg = new byte[4096];
    msg = Encoding.ASCII.GetBytes(txtMsg.Text);

    stream.Write(msg, 0, msg.Length);
}
因此,如果我在文本字段中写“mb”,它会显示一个消息框,上面写着“mb”


我想知道,如何分离NetworkStream发送的消息,以便分别设置MessageBox的捕获和内容。

正如您所注意到的,您正在通过套接字发送二进制数据。在客户机中,您从message
msg=Encoding.ASCII.GetBytes(txtMsg.Text)获取字节stringreturndata=Encoding.ASCII.GetString(msg,0,count)将其转换回字符串

在这种方法中,您可以发送例如逗号分隔的字符串,其中第一个字段是捕获,第二个是内容


然而,由于它是字节流,所以您可以将任何可序列化的内容发送到字节中。您可以通过网络流使用BinaryWriter\BinaryReader发送任何结构。

正如您所注意到的,您正在通过套接字发送二进制数据。在客户机中,您从message
msg=Encoding.ASCII.GetBytes(txtMsg.Text)获取字节stringreturndata=Encoding.ASCII.GetString(msg,0,count)将其转换回字符串

在这种方法中,您可以发送例如逗号分隔的字符串,其中第一个字段是捕获,第二个是内容


然而,由于它是字节流,所以您可以将任何可序列化的内容发送到字节中。您可以通过网络流使用BinaryWriter\BinaryReader发送任何结构。

您的当前代码最终会遇到问题。TCP协议并不能保证您将在一次
Read()
中收到整个消息。您发送的任何内容都可以自由地拆分为单独的数据包。除此之外,分离信息是一个完全不同的问题。你可以想怎么想就怎么想。可能使用换行符。可能在每个组件前面加上长度前缀。这取决于你。好吧,这就是我说的分离的基本意思。在“消息”之间放置一个特定的符号,以便我的服务器知道它的开始和结束位置。我该怎么做呢?可能重复的代码最终会在当前代码中遇到问题。TCP协议并不能保证您将在一次
Read()
中收到整个消息。您发送的任何内容都可以自由地拆分为单独的数据包。除此之外,分离信息是一个完全不同的问题。你可以想怎么想就怎么想。可能使用换行符。可能在每个组件前面加上长度前缀。这取决于你。好吧,这就是我说的分离的基本意思。在“消息”之间放置一个特定的符号,以便我的服务器知道它的开始和结束位置。我该怎么做呢?可能是的,我想用逗号把它们分开,这就是我最初的意思。我该怎么做呢?是的,我想用逗号把它们分开,这就是我最初的意思。我该怎么做?