При попытке получить строку или содержимое файла (в виде строки) через TCP, я застрял с проблемой, когда прием работает в целом, но строка
print("TCP -> Data received:\n" + file + "\n\n" + totalrecbytes + " Bytes");
отчасти застопорилась, пока я активноотключить со стороны сервера.Чем это работает, как и ожидалось.
Я отладил, и получение данных внутри цикла
while ((recBytes = netstream.Read(bytes, 0, bytes.Length)) > 0)
работает просто отлично.Это также завершает цикл в нужный момент. Но после этого просто ничего не происходит.Я не получаю ошибок, я не "пойман в ловушку" ни в одном цикле, но также не получаю ожидаемый вывод
print("TCP -> Data received:\n" + file + "\n\n" + totalrecbytes + " Bytes");
, пока я не отключусь от серверной стороны.Чем я вижу ожидаемый вывод и клиент отключен.
Вот реализация (оригинал источник )
private Thread _tcpThread;
private TcpClient _socketConnection;
public void Connect()
{
try
{
_tcpThread = new Thread(ReciveDataClient);
_tcpThread.IsBackground = true;
_tcpThread.Start();
}
catch (Exception e)
{
print(e.Message);
}
}
private void ReciveDataClient()
{
try
{
_socketConnection = new TcpClient("xxx.xxx.xxx.xxx", 54321);
print(this, "TCP -> Connection Success!");
}
catch (Exception e)
{
print("connection error: " + e.Message)
return;
}
try
{
var bytes = new byte[BUFFER_SIZE];
while (_socketConnection.Connected)
{
if (_socketConnection.Available <= 0) continue;
// Get a stream object for reading
var netstream = _socketConnection.GetStream();
int totalrecbytes = 0;
int recBytes;
string file = "";
// Read incomming stream into byte arrary.
while ((recBytes = netstream.Read(bytes, 0, bytes.Length)) > 0)
{
var incommingData = new byte[recBytes];
Array.Copy(bytes, 0, incommingData, 0, recBytes);
// Convert byte array to string message.
var serverMessage = Encoding.ASCII.GetString(incommingData);
file += serverMessage;
totalrecbytes += recBytes;
}
print("TCP -> Data received:\n" + file + "\n\n" + totalrecbytes + " Bytes");
netstream.Close();
}
print("TCP -> connection was terminated by the server");
}
catch (Exception e)
{
print(e.Message)
return;
}
}
Я ожидал бы, что смогу поддерживать соединениеживы, но по-прежнему получают данные правильно и обмениваются данными с сервером по постоянному TCP-соединению.
Что я здесь пропускаю или делаю неправильно?
ЕдинственноеОбходной путь, который я смог найти до сих пор, - это всегда отключаться от серверной части после отправки данных и в моем коде обернуть весь ReceiveDataClient
в цикл while
, как
private void ReciveDataClient()
{
while (true)
{
try
{
_socketConnection = new TcpClient(_server.ToString(), _server.Port);
//...
, чтобы немедленно начать новое соединениепосле того как сервер отправил некоторые данные и отключил клиента.