Проблема с передачей данных через 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()
На клиенте пробовали играться с networkStream.ReadTimeout?
NetworkStream.Flush ничего не делает, зарезервирован на будущее
Лучший вариант это передавать сначала какой объем данных будет передан, а потом передавать данные, клиент после получения объема, ждет пока не придут все данные.
В итоге выяснили что дело не в программе, данные до клиента запущенного на моем компе доходят нормально.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть поле дата формата Y-m-d пример заполниной таблицы ID Date 1 2019-05-19 2 2019-05-30 3 2019-05-22 4 2019-06-03
У меня имеется большое поле (div), в котором находятся 12 div меньшего размераПри нажатии на кнопку, вызывается функция js, которая чистит большое...