Я столкнулся с проблемой, когда несколько клиентов пытаются подключиться к серверу с одинаковыми учетными данными. На самом деле, когда клиент с такими же учетными данными уже подключен, будет отображаться сообщение клиенту, пытающемуся подключиться с этими учетными данными, но после этого больше не сможет подключиться больше клиентов. Я не получаю никаких исключений, ничего не ломается, но как только я проверяю состояние клиентского приложения в диспетчере задач, появляется сообщение «Не отвечает».
Клиентская функция для подключения к серверу:
public TransferClass connectMe(TransferClass transfer)
{
try
{
if (!string.IsNullOrEmpty(transfer.ipAdr))
{
ipAdress = transfer.ipAdr.Trim();
}
client = new TcpClient(ipAdress, 10000);
stream = client.GetStream();
formatter = new BinaryFormatter();
formatter.Serialize(stream, transfer);
transfer = formatter.Deserialize(stream) as TransferClass;
return transfer;
}
catch (Exception)
{
transfer.LoggedIn = false;
return transfer;
}
}
Сервер прослушивания для клиентов:
void listen()
{
try
{
while (true)
{
socket.Listen(50);
Socket client = socket.Accept();
NetworkStream stream = new NetworkStream(client);
BinaryFormatter formatter = new BinaryFormatter();
TransferClass transfer = formatter.Deserialize(stream) as TransferClass;
transfer.LoggedIn = true;
if (connectedList.ContainsKey(transfer.ClientID))
{
transfer.LoggedIn = false;
formater.Serialize(stream, transfer);
return;
}
//code which is executed if everything is OK
}
}
catch (Exception)
{
throw;
}
}
Я могу успешно отладить клиент и сервер, но как только клиент попытается соединиться с тем же ClientID
, сначала он проверяется на сервере, и сообщение о том, что он не LoggedIn
, будет отправлено обратно клиент. Но после того, как я изменил ClientID
и попытался снова подключиться, и последовал за ним с отладкой, он никогда не выходит на серверную сторону, как formatter.Serialize
не работает на клиенте.
ClientID
- это то, что клиент вводит сам.
Я предполагаю, что в той части на сервере, где я проверяю, существует ли уже клиент с таким же ClientID
, я также должен закрыть поток или что-то в этом роде, но я не уверен, как это сделать.