Embora antes que o projeto também é usado soquete, mas nem sempre construir a sua própria, de modo que o Server, final Clinet e os batimentos cardíacos, a reconexão não é muito a compreensão em profundidade do total, agora construiu-se novamente para aprofundar a compreensão sobre.
O serviço usa a interface WPF, o cliente usando o console. Conseguida reconexão pulsação, uma pluralidade de funções correspondentes para o cliente do servidor.
A. Servidor
1.1 para criar um exemplo de soquete, e ligado ao número de porta 20000; começar a ouvir e definir o número máximo de ouvintes através do método Escutar.
// Criar uma nova instância de servidor de engaste, e ligado a porta 20000 SocketServer = novo new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socketServer.Bind (a IPEndPoint novo novo (IPAddress.Any, 20000)); // definindo o número máximo de monitor de socketServer.Listen (10);
1.2 Quando há uma conexão de cliente bem-sucedido irá produzir uma nova instância soquete pelo método Accept; temporizador batimentos cardíacos podem agora ser aberto, e abrir um tópico de mensagem recebida.
// abrir um fio para ouvir o cliente a THD Tópico = new new Thread (new new ThreadStart (ListenSocket)); thd.Start (); /// <o resumo> /// começar a ouvir /// </ o Resumo> private void ListenSocket () { try { o tempo (como true) { o socket é _socket socketServer.Accept = (); // começar a batida do coração do System.Timers.Timer heartbeatTimer o System.Timers.Timer novas novas = (); heartbeatTimer.Interval = 60000; heartbeatTimer.Elapsed + = new novo Sistema .Timers.ElapsedEventHandler ((S, E) => heartbeatTimerIsUp (S, E, é _socket)); heartbeatTimer.Start (); Passe thdReceive = new Thread (novo ParameterizedThreadStart (thdRevMethod)); thdReceive.Start (_socket); } } Catch (excepção ex) { MessageBox.Show ( "程序出现异常:" + ex); } }
1.3 código para a mensagem da mensagem de recepção transmitida é a seguinte
/// <summary> ///接收消息 /// </ summary> /// <param name = "obj"> </ param> private void thdRevMethod (object obj) { soquete _socket = obj como soquete; tente { while (true) { byte [] resByte = new byte [1024]; int resInt = _socket.Receive (resByte); if (resInt> 0) { cordas res = Encoding.Default.GetString (resByte, 0, resInt); ///接收消息后操作 } } } catch (SocketException sex) { if (sex.SocketErrorCode == SocketError.ConnectionReset) { // Quando o cliente se desconecta, retirados do cliente à lista de cliente } } o catch (Exception ex) { MessageBox.Show ( "exceção de programa aparece:" EX +); } } /// <summary> / // enviar mensagem /// </ Resumo> /// <param name = "MSG"> </ param> /// <param name = "ipAndPord"> </ param> pública BOOL SENDMSG (MSG string, string ipAndPord ) { try { socket é _socket = socketTimerDic.SingleOrDefault (P & lt => String.equals (r.Key.RemoteEndPoint.ToString (), ipAndPord)) Key ;. ! IF (é _socket = null) { byte [] = Encoding.Default byteStr .GetBytes (MSG); _socket.Send (byteStr); return true; } Else { return false; } } Catch (exceção) { return false; } }
II. Cliente
2.1 para criar uma instância de Socket e se conectar ao servidor onde porta ip; conexão bem-sucedida vai coração certamente aberta e abra os dois tópicos está enviando e recebendo mensagens.
// Criar uma nova instância do cliente eo servidor está ligado ao número da porta onde SocketClient novo new = o Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socketClient.Connect ( "127.0.0.1", 20000); Console.WriteLine ( "conectado com sucesso ao servidor"); heartbeatTimer.Start (); // fio abertas envia uma mensagem fio thdSend = new nova thread (nova novo o ThreadStart (thdSendMethod)); thdSend.Start (); // abrir um fio receber informações rosca = o segmento novo novo thdRev (a ThreadStart novo novo (thdRevMethod)); thdRev.Start ();
2.2 mensagens de enviar o código e recebe a seguinte mensagem, desligue sex.SocketErrorCode == SocketError.ConnectionReset desencadear uma exceção no segmento que recebe a mensagem quando o servidor, em seguida, após tempo de abertura reconexão à captura
/// <summary> ///接收消息 /// </ summary> estática private void thdRevMethod () { try { while (true) { byte [] resByte = new byte [1024]; int resInt = socketClient.Receive (resByte); if (resInt> 0) { Console.WriteLine (Encoding.Default.GetString (resByte, 0, resInt)); } } } Catch (SocketException sex) { if (sex.SocketErrorCode == SocketError.ConnectionReset) { Console.WriteLine ( "服务端断开5s后重连!"); reconnectTimer.Start (); heartbeatTimer.Stop (); } } o catch (Exception ex) { Console.WriteLine ( "exceção de programa aparece:" EX +); heartbeatTimer.Stop (); } } // Enviar estática private void thdSendMethod () { try { o tempo (a verdadeira) { Cadeia Console.ReadLine RES = (); byte [] = resByte Encoding.Default.GetBytes (RES); socketClient.Send (resByte); } } o engate (excepção EX) { Console.WriteLine ( "ocorre excepção programa : "EX +); heartbeatTimer.Stop (); } }
III. Executar a amostra
Quatro .. resumo
Se o código no lugar errado, a esperança pode ajudar a apontar correções.
Que deve prestar atenção para o seguinte:
após 1.WPF perto da janela, necessidade Environment.Exit (0); sair no final do processo de servidor inteiro atual, caso contrário processo de soquete aberta ainda vai receber e enviar, o cliente não detecta para o servidor é desconectado.
DESCRIÇÃO cliente / conexão com o servidor está desligado, e assim por diante necessidade de ser realizada mesmo quando a operação exceção sex.SocketErrorCode == SocketError.ConnectionReset 2. Captura da SocketException.
3. Ao receber a mensagem, quando necessário GetString (byte [] bytes, índice int, int count) de comprimento especificado, sem o uso GetString (byte [] bytes), ou pode ser uma grande quantidade de espaço.
4. Se os parâmetros de transmissão temporizador desejado pode ser passado para uma variável, definindo uma variável global, ou (S, E) => heartbeatTimerIsUp (s, e, _socket) processo separado.
Fonte baixar o seguinte endereço: SocketDemo.rar