2014-11-28 3 views
5

Итак, я пишу этот школьный проект, который должен быть базовой программой чата, состоящей из клиента и сервера. Я пытаюсь работать с закрытым сервером или клиентскими программами.C# Программирование сокетов, закрытие окон

Так что, когда вы нажимаете большую красную X в окне клиента, это то, что происходит:

private void Window_Closing(object sender, CancelEventArgs e) 
{ 
    Data msgToSend = new Data(); 
    msgToSend.cmdCommand = Command.Logout; 
    msgToSend.strName = LoginName; 
    byte[] b = msgToSend.ToByte(); 
    ClientSocket.Send(b); 
} 

Он посылает сообщение серверу, информируя его, что кто-то вход, так что он может удалить пользователя из списка пользователей и т. д.

Проблема возникает, когда сервер закрывается, и пытается отправить сообщение клиентам, сообщив им, что сервер отключился, поэтому клиенты могут информировать пользователей, а затем закрыть ,

Таким образом, сообщение сервера приходит, и клиентская программа уже закрывается, но указанный выше код попытается сообщить серверу ложно о выходе из системы, но к этому времени сервер уже отключен, поэтому будет целый много сообщений об ошибках.

Я предполагаю, что в процедуре, описанной выше, мне понадобилось бы какое-то выражение «если», которое могло бы решить, должен ли код работать, но я понятия не имею, каким он должен быть. Идеи?

ответ

3

Просто проверьте, подключен ли клиент к серверу. Оба Socket и TcpClient классы имеют Connected свойство:

http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.connected%28v=vs.110%29.aspx http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.connected(v=vs.110).aspx

Вы можете сделать:

if (client.Connected) { 
     Data msgToSend = new Data(); 
     msgToSend.cmdCommand = Command.Logout; 
     msgToSend.strName = LoginName; 
     byte[] b = msgToSend.ToByte(); 
     ClientSocket.Send(b); 
} 
Смежные вопросы