Есть ли способ заставить tcp-сервер отправлять ответы, отличные от повторения входящих сообщений?

#c# #.net #tcp #tcpserver #system.net.sockets

#c# #.net #tcp #tcpserver #system.net.sockets

Вопрос:

Я, очевидно, новичок в TCP-серверах. Приведенный ниже код работает просто отлично — он «только» повторяет сообщения, которые он получает. Но мой вопрос «простой»: как я могу отправлять ответы своему клиенту, кроме простого повторения запроса, как я делаю ниже?Например, если бы я хотел отправить данные обратно (специально для меня, данные «OFML» в XML-подобной форме для конечных пользователей уголовного правосудия).

Но я бы согласился на «Привет, мир!»!

Все мои попытки сделать это приводят к сбою моего клиента (проприетарный код, которым я не могу поделиться) — и некоторым настраиваемым сообщениям об ошибках, таким как «Пакет не найден».

Любые предложения будут высоко оценены — или ссылки на некоторую четкую документацию о том, как это сделать.

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

 using System.Drawing;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Net.NetworkInformation;
using System.Threading;


namespace FoxTalkMOCK
{
    class Program
    {
        public static void Main()
        {
            TcpListener server = null;
            try
            {
                Int32 port = 8080;
                IPAddress localAddr = IPAddress.Parse("10.116.45.49");
 
                server = new TcpListener(localAddr, port);
 
                server.Start();

                // Buffer for reading data
                Byte[] bytes = new Byte[18];
                String data = null;

                // Enter the listening loop.
                while (true)
                {
                    Console.Write("Waiting for a connection... ");
 
                    TcpClient client = server.AcceptTcpClient();
                    Console.WriteLine("Connected!");
                    data = null;
                    // Get a stream object for reading and writing
                    NetworkStream stream = client.GetStream();                   
                    int i;                   
                    // Loop to receive all the data sent by the client.
                    try
                    {
                    while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                            // Translate data bytes to a ASCII string.
                            data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                        Console.WriteLine("Received: {0}", data);

                        // Process the data sent by the client.
                        data = data.ToUpper();

                            string bitString = BitConverter.ToString(bytes);
                            bitString = bitString.Replace("-", ", 0x");
                            bitString = "0x"   bitString;
                            Console.WriteLine(bitString);

                            // *******************Send response*********************
                            stream.Write(bytes, 0, bytes.Length);
                            Console.WriteLine("Sent: {0}", System.Text.Encoding.ASCII.GetString(bytes, 0, bytes.Length));
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
                    // Shutdown and end connection
                    client.Close();
                }
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
            }
            finally
            {
                // Stop listening for new clients.
                server.Stop();
            }
            Console.WriteLine("nHit enter to continue...");
            Console.Read();
        }
    }
}```

 

Ответ №1:

Пример подключается и получает данные, затем отправляет эти данные обратно и отключается.

Если вы хотите сохранить сокет, сохраните его без взлома.

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

Комментарии:

1. На самом деле внутреннее «while» поддерживает работу — консоль показывает такие вещи, как «Ожидание соединения… Подключено! Получено: ? ?U $ ☺CY ☺ Отправлено: ? ?U $ ☺ CY ☺ Получено: ?? ? NB64CRLFU? ? Отправлено: ?? ? NB64CRLFU? ?» Опять же — моя самая большая проблема заключается в том, как отправить обратно что-то другое, а не просто повторить то, что я получил… Спасибо!

2. поток. Запись (байты, 0, байты. Длина); -> вместо байтов введите нужные вам данные.

Ответ №2:

Ответ на простой возврат «привет, мир» выглядит следующим образом:

 var strBuffer = "Hello World!";
byte[] array = new byte[strBuffer.Length];
array = System.Text.Encoding.ASCII.GetBytes(strBuffer);
stream.Write(array, 0, array.Length)