Soquete fácil de construir

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.

Copie o código
// 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); 
    } 
}
Copie o código

1.3 código para a mensagem da mensagem de recepção transmitida é a seguinte

Copie o código
/// <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; 
    } 
}
Copie o código

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.

Copie o código
// 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 ();
Copie o código

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

Copie o código
/// <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 (); 
    } 
}    
Copie o código

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

Acho que você gosta

Origin www.cnblogs.com/Freedom0221/p/12604354.html
Recomendado
Clasificación