tags:

views:

435

answers:

1

I want to create SOCKET chat(server + clients) with private messaging. When client write smth to stream, he should notify server that it is private message for user X, how can i do this?

Actually i can do smth like this:

 string command = "PRIV|" + txtMessage.Text;
 swSender.WriteLine(command);

but i think it isn't good, for example if user wants send message like our "PRIV|" flag it will be errors

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

update :ok another question how i can identife that it is private message, for example if i use this method:

private 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
}

if user wants send message like our "PRIV|" flag it will be errors

update :in this case if client want to send message "Test message|other test" logwriter.WriteLine(tokens[1]) - shows only tokens[1] - "Test message" without "other test" message

+3  A: 

One really trivial way to fix your implementation is to prepend non-private messages with something else, say "NORM|". This way you can't fake private messages with normal ones.

Not really sure that PRIV| is enough though, a private message is sent to someone, so you'd have to include the recipient too right?

Anyway, the usual way to do this is to form "packets" from your commands. Your packet will contain the payload (the text to be sent) along with a header (the first few bytes that usually start with packet length, then command id -- normal msg, private msg, /who command, ping/pong, etc etc, and then some arbitrary data for the specific command you chose, like say.. a recipient name). You CAN make it into just one string if you want, by, for example, joining the fields with | characters like in your message, but this limits your field choices to non-| characters. A better way is to send them in binary format.

update: regarding your addition, I don't see what error you're talking about. The code seems fine to me. You split the line into tokens and check the command token first (priv/chat/whatever), then decide how to handle the rest of the tokens (the message in this case) depending on what the command was.

I need to see more code, what you are expecting to get and what you are getting to help you further.

Blindy
You should have linked to the IRC RFC with all his and yours references to the same thing..
Benjamin Podszun
look at my another question in header please
Sergey
Any similarity to the IRC RFC is simply coincidental, I never read it nor do I know how IRC works. I'm only thinking about some common sense ways to improve his implementation.
Blindy