#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)