TCPClient и TCPListener только прослушивание не отправляет - PullRequest
0 голосов
/ 29 января 2020

Привет. В настоящее время я делаю две программы, одна из которых предназначена для работы в качестве сервера, а одна из них предназначена для работы в качестве клиента. В настоящее время у меня возникла проблема, когда сервер может получать сообщения от клиента, но не может отправить их обратно.

Код сообщения отправки клиентом и сервером идентичен

    public void SendMessage(MessageContainer msg)
    {
        TcpClient client = new TcpClient(IP,Port);
        serializer.Serialize(client.GetStream(), msg);
        client.Close();
    }

Единственный Разница в программах заключается в том, что сервер работает круглосуточно, то же самое относится и к клиенту, но клиент может ожидать, что после его отправки появится конкретное сообщение c, такое как запрос ключа RSA. Сервер и клиент имеют одну и ту же процедуру GetMessage

    public MessageContainer GetMessage()
    {
        if (listener.Pending())
        {
            TcpClient client = listener.AcceptTcpClient();
            string IP = ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString();
            NetworkStream stream = client.GetStream();
            MessageContainer container = (MessageContainer)xmlSerializer.Deserialize(stream);
            container.IP = IP;
            return container;
        }
        else
        {
            return null;
        }
    }

Но для прослушивания у клиента также есть указанный метод сообщения c, который, похоже, не работает ни при каком сценарии.

    public MessageContainer GetSpecificMessage(string Expectation)
    {
        timer.Stop();
        MessageContainer msg = null;
        do
        {
            msg = GetMessage();
            if (msg != null)
            {
                if (msg.Message == Expectation)
                {
                    timer.Start();
                    return msg;
                }
                else
                {
                    messages.Enqueue(msg);
                    msg = null;
                }
            }
        }
        while (msg == null);
        return null;
    }

Я пытался какое-то время поработать над этой проблемой, включая перекодировку всего своего сервера, но я всегда получаю одну и ту же ошибку, я пытался отключить брандмауэры Mcafee на обеих машинах, и до сих пор не было никакого прогресса проблема. Любая помощь будет оценена, спасибо.

1 Ответ

0 голосов
/ 30 января 2020

Вашему серверу необходимо принять клиентский сокет, также называемый дочерним сокетом, а затем отправить обратно верхний дочерний сокет.

На сервере ваш SendMessage станет:

public void SendMessage(MessageContainer msg, TcpClient client)
{
    serializer.Serialize(client.GetStream(), msg);
}

Где client - это значение, которое вы здесь получаете:

TcpClient client = listener.AcceptTcpClient();

Затем вы используете тот клиент, который был получен из Listening / Accepting для двунаправленной связи.

Вам также не нужно закрывать TcpClient до все ваши сообщения завершены, и вы полностью завершили работу с сокетами.

Итак, на сервере вы прослушиваете соединения Tcp, используя AcceptTcpClient, каждое соединение получает свой собственный TcpClient, который иногда называется child client, но это просто обычный сокет, из которого вы можете читать и писать.

...