Сервер сокетов C # не может получить данные от одного и того же клиентского соединения более одного раза - PullRequest
1 голос
/ 22 февраля 2011

Я недавно задал связанный вопрос В C # как мне, чтобы сокет оставался открытым и принимать новые данные? и несколько решил его, но теперь у меня возникают проблемы с получением моего сервера для полученияданные от одного и того же клиента более одного раза.

Я написал простой сервер сокетов, используя форму Windows в VS, которая имеет кнопку, которая вызывает функцию приема

public void Receive()
    {
        try
        {
            byte[] bytes = new byte[256];
            received = s1.Accept().Receive(bytes);
            receivedText.Text += System.Text.ASCIIEncoding.ASCII.GetString(bytes);
        }
        catch (SocketException e)
        {
            Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
            return;
        }
    }

Это работает, еслив первый раз, когда я отправляю сообщение от своего клиента, но если я пытаюсь отправить что-то еще и нажимаю на кнопку «получить», мой сервер просто зацикливается и никогда не получает новые данные.Однако, если я отправляю откуда-то еще или перезапускаю соединение с моего клиента, я могу отправлять данные.

Я хотел бы, чтобы мой сервер мог получать любое количество данных от того же клиента (s) одновременно.Пожалуйста, спросите, если вам нужно больше кода / детали.Не уверен, что важно, так как я довольно новичок в программировании сокетов.

1 Ответ

1 голос
/ 22 февраля 2011

Вы должны вызывать Accept () только один раз для каждого клиента, а не каждый раз, когда вы хотите получать новые данные. Accept () в основном ожидает подключения клиента к сокету вашего сервера s1 (и возвращает новый сокет для отправки / получения данных с этим клиентом), поэтому здесь каждый раз, когда вызывается функция Receive (), ваш сокет ожидает, пока другой клиент подключиться, поэтому он работает только один раз.

Вот пример (код взят из вашего предыдущего вопроса):

s1.Bind(endP);
s1.Listen(10);
Socket s2 = s1.Accept(); // Waits for a client to connect and return a socket, s2, to communicate with him
while (true) {
    Receive(s2);
}
...

Функция Receive ():

public void Receive(Socket s)
{
    try
    {
        byte[] bytes = new byte[256];
        received = s.Receive(bytes);
        receivedText.Text += System.Text.ASCIIEncoding.ASCII.GetString(bytes);
    }
    catch (SocketException e)
    {
        Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
        return;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...