我想用私人消息创建SOCKET聊天(服务器+客户端)。 当客户端写smth流时,他应该通知服务器它 是用户X的私人消息,我该怎么做?
其实我可以这样做:
string command = "PRIV|" + txtMessage.Text;
swSender.WriteLine(command);
但我认为这不好,例如,如果用户想要发送消息 喜欢我们的“PRIV |”标记它将是错误
public class TestChat
{
private StreamWriter swSender;
private IPAddress ipAddr;
private void InitializeandSend()
{
//ip from text box
ipAddr = IPAddress.Parse(txtIp.Text);
// Start a new TCP connections to the chat server
tcpServer = new TcpClient();
tcpServer.Connect(ipAddr, 1986);
//...
//sending message from text box
swSender.WriteLine(txtMessage.Text);
swSender.Flush();
}
}
更新:确定另一个问题,我如何识别它是私人消息,例如,如果我使用此方法:
私有NetworkStream ns;
Byte[] buffer = new Byte[2048];
ns.Read(buffer,0,buffer.Length);
string chatter = System.Text.Encoding.ASCII.GetString(buffer);
string[] tokens = chatter.Split(new Char[]{'|'});
if (tokens[0] == "CHAT")
{
logwriter.WriteLine(tokens[1]); //writing
}
如果用户想发送像我们的“PRIV |”这样的消息标记它将是错误
更新:在这种情况下,如果客户端想要发送消息“测试消息|其他测试”
logwriter.WriteLine(tokens[1])
- 仅显示令牌[1] - “测试消息”而没有“其他测试”消息
答案 0 :(得分:4)
修复实现的一个非常简单的方法是使用其他内容预先添加非私有消息,例如"NORM|"
。通过这种方式,您无法使用普通邮件伪造私人邮件。
不确定PRIV|
是否足够,私人邮件会发送给某人,所以你必须包括收件人吗?
无论如何,通常的做法是从命令中形成“数据包”。您的数据包将包含有效负载(要发送的文本)以及标头(通常以数据包长度开头的前几个字节,然后是命令ID - 正常消息,私有消息,/ who命令,ping / pong等等,然后是您选择的特定命令的一些任意数据,比如说..收件人名称)。如果您愿意,可以将其组合成一个字符串,例如,通过使用|
字符加入字段,例如您的邮件,但这会将您的字段选择限制为非|
个字符。更好的方法是以二进制格式发送它们。
更新:关于您的添加,我不会看到您正在谈论的错误。代码对我来说似乎很好。您将该行拆分为令牌并首先检查命令令牌(priv / chat / whatever),然后根据命令的内容决定如何处理其余的令牌(本例中的消息)。
我需要看到更多代码,您期望获得的内容以及您将进一步帮助您的内容。