SOCKET чат C # с личными сообщениями - PullRequest
1 голос
/ 27 марта 2010

Я хочу создать чат SOCKET (сервер + клиенты) с личными сообщениями. Когда клиент пишет что-то в поток, он должен уведомить сервер, что это такое личное сообщение для пользователя 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();
}
}

update : хорошо, еще один вопрос, как я могу определить, что это личное сообщение, например, если я использую этот метод:

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
}

если пользователь хочет отправить сообщение типа "PRIV |" флаг это будут ошибки

обновление : в этом случае, если клиент хочет отправить сообщение «Тестовое сообщение | другой тест» logwriter.WriteLine(tokens[1]) - показывает только токены [1] - «Тестовое сообщение» без сообщения «другой тест»

1 Ответ

4 голосов
/ 27 марта 2010

Один из действительно тривиальных способов исправить вашу реализацию - добавить не частные сообщения к чему-то другому, скажем, "NORM|". Таким образом, вы не можете подделывать личные сообщения с обычными.

Не совсем уверен, что PRIV| достаточно, хотя, личное сообщение кому-то отправлено, так что вам придется включить получателя тоже верно?

В любом случае, обычный способ сделать это - сформировать «пакеты» из ваших команд. Ваш пакет будет содержать полезную нагрузку (текст для отправки) вместе с заголовком (первые несколько байтов, которые обычно начинаются с длины пакета, затем идентификатор команды - обычное сообщение msg, личное сообщение msg, команда / who, ping / pong и т. Д. И т. Д. И т. Д. , а затем некоторые произвольные данные для конкретной команды, которую вы выбрали, например, скажем .. имя получателя). Вы МОЖЕТЕ превратить его в одну строку, если хотите, например, путем объединения полей с | символами, как в вашем сообщении, но это ограничивает ваш выбор полей не-| символами. Лучше отправлять их в двоичном формате.

обновление : относительно вашего добавления я не вижу, о какой ошибке вы говорите. Код кажется нормальным для меня. Вы разбиваете строку на токены и сначала проверяете токен команды (priv / chat / what), а затем решаете, как обрабатывать остальные токены (в данном случае это сообщение), в зависимости от того, какой была команда.

Мне нужно увидеть больше кода, что вы ожидаете получить и что вы получаете, чтобы помочь вам в дальнейшем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...