У меня есть следующий код, выполняемый прослушивающим потоком. Что он делает: читает первое сообщение как общую длину сообщения, затем собирает все пакеты в большой массив данных. (Я отправляю изображения) Все работает по назначению.
Но после того, как получено первое изображение и функция выполнена. («ImageLengthResetted» распечатывается) Он закрывает соединение.
Я думаю, это связано с тем, что я выхожу за рамки:
using(connectedTcpClient = tcpListener.AcceptTcpClient())
и вот что убивает связь. Как я могу сохранить это соединение открытым?
Добавление еще одного
while(true)
после того, как меня подключили, ничего не получится. А также выполнение цикла while, завершенного после использования статов.
private void ListenForIncommingRequests()
{
try
{
// Create listener on localhost port 8052.
localAddr = IPAddress.Parse(IPadrr);
Debug.Log(localAddr);
tcpListener = new TcpListener(localAddr, port);
Debug.Log("Before Init tcplistern");
tcpListener.Start();
Debug.Log("Server is listening");
Byte[] dataRecieved = new Byte[SEND_RECIEVE_COUNT];
while (true)
{
using (connectedTcpClient = tcpListener.AcceptTcpClient())
{
Debug.Log("Accepted TCP Client");
// Get a stream object for reading
using (NetworkStream stream = connectedTcpClient.GetStream())
{
int length;
Debug.Log("Accepted Stream");
// Read incomming stream into byte arrary.
while ((length = stream.Read(dataRecieved, 0, dataRecieved.Length)) != 0)
{
Debug.Log("receiving Loop lengt: " + length);
counterReceived++;
//Get Message length with first message
if (messageLength == 0)
{
messageLength = System.BitConverter.ToInt32(dataRecieved, 0);
data = new byte[messageLength];
messageJunks = messageLength / SEND_RECIEVE_COUNT;
restMessage = messageLength % SEND_RECIEVE_COUNT;
junkCounter = 0;
}
else
{
if (junkCounter < messageJunks)
{
Array.Copy(dataRecieved, 0, data, junkCounter * SEND_RECIEVE_COUNT, SEND_RECIEVE_COUNT);
junkCounter++;
}
else
{
Array.Copy(dataRecieved, 0, data, junkCounter * SEND_RECIEVE_COUNT, restMessage);
//Whole Message recieved, reset Message length
messageLength = 0;
readyToDisplay = true;
Debug.Log("ImageLengthResetteed");
}
}
}
}
}
}
}
catch (Exception socketException)
{
Debug.Log("SocketException " + socketException.ToString());
}
}
На стороне клиента открывается поток отправки со следующей функцией, в которой socketConnection глобально инициализируется в принимающем потоке клиента:
private void sendData(byte[] data)
{
try
{
//socketConnection = new TcpClient(IPadrr, port);
using (NetworkStream stream = socketConnection.GetStream())
{
//Prepare the Length Array and send first
byte[] dataLength = BitConverter.GetBytes(data.Length);
int packagesSend = 0;
int numberPackages = data.Length / SEND_RECIEVE_COUNT;
if (stream.CanWrite)
{
for (counter = 0; counter <= data.Length; counter += SEND_RECIEVE_COUNT)
{
if (counter == 0)
{
stream.Write(dataLength, 0, dataLength.Length);
}
if (packagesSend < numberPackages)
{
stream.Write(data, counter, SEND_RECIEVE_COUNT);
Thread.Sleep(20);
packagesSend++;
}
else
{
stream.Write(data, counter, data.Length % SEND_RECIEVE_COUNT);
Debug.Log("FINDISCHD");
}
}
}
}
}
catch (Exception err)
{
print(err.ToString());
}
}
Рад любой помощи!
добавил клиентский код. Но это не проблема сервера. Исключение сокета говорит, что удаленный хост закрыл соединение.
Remotehost - это просто клиент, который не является вашим местным. Итак, если код сервера бросает его, удаленный хост является клиентом и наоборот.
У вас проблема с тестированием цикла While для конца потока. Чтение TCP-потока отличается от файлового потока. Файловый поток, когда вы доходите до конца файла, вы читаете нуль, а затем прекращаете чтение и закрываете файл. С TCP вы находитесь в конце файла, чтобы начать его еще до того, как вы получите какие-либо данные. Произойдет проверка на ноль, а затем вы выйдете из цикла while и закроете соединение.
Можете ли вы немного очистить свой код и удалить ненужные части? Очень сложно понять, что происходит в таком состоянии.
ай ладно, запуталась словом "хозяин". Итак, я, вероятно, исчерпал область использования (Networkstream) после отправки, а затем соединение закрывается?
Я считаю, что нашел проблему. Это на клиенте. Вы глобально инициализируете socketConnection, но затем удаляете поток после using(NetworkStream stream = socketConnection.GetStream()
итак, глобально инициировать поток, чтобы он оставался открытым?
@jdweng, но соединение не установлено в цикле while, где я проверяю длину
Я бы запускал TcpClient каждый раз, когда вам нужно было вызвать веб-службу. За исключением случаев, когда вы знаете, что собираетесь вызывать веб-службу несколько раз подряд.
Спасибо @MindSwipe, я решил это! Глобальная инициализация потока делает свое дело





Проблема была на стороне клиента. Я инициализировал
NetworkStream stream;
теперь глобально в той же функции socketConnection получает init.
Как выглядит ваш клиентский код?