Событие AppServer.NewRequestReceived не запускается в SuperSocket

Я создал сервер, который просто печатает строку при получении нового запроса:

var server = new AppServer();
if (!server.Setup(2012) || !server.Start()) {
    return;
}
server.NewSessionConnected += (session) => Console.WriteLine("new connection");
server.NewRequestReceived += (session, requestInfo) => Console.WriteLine("new request");

Я подключаюсь к нему из netcat:

C: \ Users \ sashoalm> nc localhost 2012
тестовое задание
тестовое задание
^C
C:\Users\sashoalm>

Это печатает new connection но никогда не печатает new requestнесмотря на то, что набрал 2 строки из netcat. Я знаю, что netcat отправляет текст на сервер каждый раз, когда набирается полная строка (так работает netcat).

Редактировать: я нашел еще один (не очень хорошо сформулированный) вопрос без ответа, который, возможно, задает то же самое - Как отправить данные на сервер с помощью библиотеки суперсокетов, но я не совсем уверен, если это та же проблема. Кажется, парень пытается отправить данные из кода.

Еще один связанный с этим вопрос - C# SuperSocket без протокола. Там говорят о протоколах. Существует ли протокол SuperSocket по умолчанию, если вы его не указали? Это HTTP или что-то еще?

1 ответ

Решение

Используя простой клиент ниже, на основе этого примера MSDN

    static void Main(string[] args)
    {
        IPHostEntry ipHostInfo = Dns.Resolve("localhost");
        IPAddress ipAddress = ipHostInfo.AddressList[0];
        IPEndPoint remoteEP = new IPEndPoint(ipAddress, 2012);

        Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        sender.Connect(remoteEP);

        Console.WriteLine("Socket connected to {0}", sender.RemoteEndPoint.ToString());

        List<string> list = new List<string>
            {
                "Test1\r\n",
                "Test2",
                "Test3\r\n",
                "Test4\r\n",
                "Test5\r\n",
                "Test6\r\n",
                "Test7",
                "Test8\r\n",
                "Test9\r\n",
            };

        foreach (string s in list)
            sender.Send(Encoding.ASCII.GetBytes(s));

        sender.Shutdown(SocketShutdown.Both);
        sender.Close();
    }

и используя слегка модифицированную версию вашего сервера:

    static void Main(string[] args)
    {
        var server = new AppServer();

        if (!server.Setup(2012) || !server.Start())
        {
            return;
        }

        server.NewSessionConnected += (session) => Console.WriteLine("new connection");
        server.NewRequestReceived += (session, requestInfo) => Console.WriteLine("new request: Key={0}", requestInfo.Key);

        Console.WriteLine("Press ENTER to exit....");
        Console.ReadLine();
    }

показывает эффект использования или нет \r\n в качестве терминатора для запроса:

Press ENTER to exit.... 
new connection 
new request: Key=Test1 
new request: Key=Test2Test3 
new request: Key=Test4 
new request: Key=Test5
new request: Key=Test6 
new request: Key=Test7Test8 
new request: Key=Test9

Запросы без терминатора объединяются со следующим, пока терминатор не будет найден.

Другие вопросы по тегам