TcpListener проблема принятия данных

111
16 января 2021, 08:10

Проблема с передачей данных через BinaryReader/BinaryWriter.

Если я захочу передать файл от сервера до клиента в локальной сети, я его спокойно получу. Если же я его попробую получить из-вне, мне выкинет тайм-аут т.к binaryReader.ReadString() не смогла прочитаться.

Проблема заключается в следующем. Если отправить файл объемом в 10кб а следом файл в 50кб, то этого не возникнет. У меня вопрос, это можно исправить? Пробовал изменять буферы и клиента и сервера, не помогло. Вот код:

Клиент:

class Program
{
static void Main(string[] args)
{
    try
    {
        TcpClient client = new TcpClient();
        client.Connect(IPAddress.Parse("..."), 80);
        NetworkStream networkStream = client.GetStream();
        BinaryWriter binaryWriter = new BinaryWriter(networkStream);
        BinaryReader binaryReader = new BinaryReader(networkStream);
        binaryWriter.Write("GetFile");
        binaryWriter.Flush();
        if (binaryReader.ReadString() == "TakeFile") // If I try to load a file from outside, it stays on that line. After about 10 seconds, displays an error about TimeOut
        {
            int Lenght = binaryReader.ReadInt32();
            byte[] file = binaryReader.ReadBytes(Lenght);
        }
        Console.WriteLine("Completed!");
    } catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    Console.ReadKey();
}

Сервер:

class Program
{
static void Main(string[] args)
{
    HttpServer server = new HttpServer(new TcpListener(IPAddress.Any, 80));
    server.Start();
    Console.ReadKey();
}
}
public class HttpServer
{
TcpListener listener;
public HttpServer(TcpListener listener)
{
    this.listener = listener;
}
public void Start()
{
    listener.Start();
    WaitRequest();
}
private void WaitRequest()
{
    new Thread(() =>
    {
        while (true)
        {
            try
            {
                TcpClient client = listener.AcceptTcpClient();
                NetworkStream networkStream = client.GetStream();
                BinaryWriter binaryWriter = new BinaryWriter(networkStream);
                BinaryReader binaryReader = new BinaryReader(networkStream);

                byte[] file = File.ReadAllBytes("...");
                if (binaryReader.ReadString() == "GetFile")
                {
                    binaryWriter.Write("TakeFile");
                    binaryWriter.Write(file.Length);
                    binaryWriter.Write(file); // But if we remove or change the bytes of the file to something else, the client will accept it absolutely normal.
                    binaryWriter.Flush();
                }
                client.Close();
                Console.WriteLine("Completed!");
            } catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    })
    {
        IsBackground = true
    }.Start();
}
}

Ошибка:

System.IO.IOException: Unable to read data from the transport connection: Удален ный хост принудительно разорвал существующее подключение. ---> System.Net.Socket s.SocketException: Удаленный хост принудительно разорвал существующее подключени е at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 s ize) --- End of inner exception stack trace --- at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 s ize) at System.IO.BinaryReader.ReadString() at ConsoleApp1.Program.Connect()

Answer 1

На клиенте пробовали играться с networkStream.ReadTimeout?

NetworkStream.Flush ничего не делает, зарезервирован на будущее

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

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

READ ALSO
Что не верно в этй строке?

Что не верно в этй строке?

При sumbit-е кнопки в обратной форме сайт выдает такую ошибку:

140
laravel 5.8 data base query Builder

laravel 5.8 data base query Builder

Есть поле дата формата Y-m-d пример заполниной таблицы ID Date 1 2019-05-19 2 2019-05-30 3 2019-05-22 4 2019-06-03

133
Передача значения поля БД в backgroundImage div'a в js функции

Передача значения поля БД в backgroundImage div'a в js функции

У меня имеется большое поле (div), в котором находятся 12 div меньшего размераПри нажатии на кнопку, вызывается функция js, которая чистит большое...

122