2010-03-27 210 views
1

我想用私人消息创建SOCKET聊天(服务器+客户端)。 当客户端写入流媒体时,他应该通知服务器它 是用户X的私人消息,我该怎么做?SOCKET与私人消息聊天C#

其实我可以做水木清华这样的:

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(); 
} 
} 

更新:确定另外一个问题我怎么可以identife,这是私人信息,例如,如果我用这个方法:

私人的NetworkStream纳秒;

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] - “测试消息”没有“其他测试”消息

回答

3

修复你的实现的一个非常简单的方法是在其他东西前加上非私人消息,比如"NORM|"。这样你就不能伪造普通消息的私人消息。

虽然不知道PRIV|是否足够,但有人会将私人讯息发送给某人,因此您必须包含收件人。

无论如何,通常的做法是从命令中形成“数据包”。您的数据包将包含有效负载(要发送的文本)以及标题(通常以数据包长度开始的前几个字节,然后是命令标识 - 普通消息,私人消息,/ who命令,ping/pong等) ,然后针对您选择的特定命令输入一些任意数据,例如说..收件人姓名)。如果你愿意,你可以把它变成一个字符串,例如,通过在你的消息中加入|字符的字段,但是这会限制你的字段选择为非|字符。更好的方法是以二进制格式发送它们。

更新:关于你的补充,我没有看到你在说什么错误。代码对我来说似乎很好。你将行分成标记并首先检查命令标记(priv/chat/whatever),然后根据命令是什么来决定如何处理剩余的标记(本例中为消息)。

我需要看到更多的代码,你期望得到什么以及你得到什么来帮助你进一步。

+0

你应该已经连接到IRC RFC他和你的所有引用同样的事情.. – 2010-03-27 09:35:22

+0

看看我的头一个问题请 – Sergey 2010-03-27 09:45:28

+0

任何相似的IRC RFC仅仅是巧合,我从来不看它,我也不知道IRC如何工作。我只想着一些常识来改进他的实施。 – Blindy 2010-03-27 10:01:06