C #에서 간단한 TCP / IP 에코 서버 및 클라이언트 응용 프로그램

1. TCP 서버

 

서버의 작업은 클라이언트에 연결하여 수동적으로 연결을 기다릴의 엔드 포인트를 설정하는 것입니다.

일반적인 TCP 서버는 두 단계로 진행됩니다

1. 로컬 주소와 포트를 지정하여 TcpListener의 인스턴스를 생성하고, 시작 () 메소드를 호출한다.

이 소켓은 지정된 포트에서 들어오는 연결을 수신합니다.

2. 반복 :
다음 들어오는 얻을 TcpListener의 AcceptTcpClient () 메서드를 호출 ■
   클라이언트 연결을. 새로운 클라이언트 접속의 확립되면, 인스턴스
   새로운 연결하여 TcpClient가 생성되고 AcceptTcp-에 의해 반환
   클라이언트 ()를 호출합니다.
■ ()하여 TcpClient의 방법 읽기를 (사용하여 클라이언트와 통신) 및 쓰기
   는 NetworkStream을.
새로운 클라이언트 소켓 연결을 닫습니다 ■과의 닫기 () 메소드를 사용하여 스트림
   는 NetworkStream 및하여 TcpClient를.

TcpEchoServer.cs

사용하여 시스템; // 콘솔, INT32, ArgumentException이, 환경에 대한 
사용 System.Net을; // 하여 IPAddress가 
사용 System.Net.Sockets을; // TcpListener를 들어,지면 TcpClient 

클래스 TcpEchoServer 
{ 
    개인  CONST의  INT의 BUFSIZE = 32 ; // 수신 버퍼 사이즈 
    
    정적  무효 메인 ( 문자열 []를 인수) 
    { 
        경우 (args.Length> 1 ) // 인수의 정확한 번호 테스트 
            던져  새로운 (ArgumentException이를 "매개 변수 : [<포트>] " ); 
        
        INT servPort = (args.Length == 1 )에서 Int32.Parse (인수 [? 0 ]) : 7 ; 

        TcpListener 리스너 = ; 

        시도  
        { 
            // 클라이언트 연결을 허용하도록 TCPListener 만들기 
            청취자 = 새로운 TcpListener (IPAddress.Any, servPort) 
            listener.Start (); 
        } 
        캐치 (SocketException이 자체) 
        { 
            Console.WriteLine (se.ErrorCode + " : " + se.Message);
            Environment.Exit (se.ErrorCode); 
        } 

        바이트 [] = rcvBuffer 새로운  바이트 [BUFSIZE]; // 버퍼 수신 
        INT의 bytesRcvd을; // 수신 바이트 수 계산 

        (;;) 
        { 
            // 받아들이고 접속 서비스를 영원히 실행 
            하여 TcpClient 클라이언트 = ; 
            NetStream을는 NetworkStream = ;
            시도  
            { 
                클라이언트 ) (= listener.AcceptTcpClient을; // 클라이언트 연결 가져 오기 
                NetStream을을 =client.GetStream (); 
                Console.Write는 ( " - 클라이언트 처리 " ) 

                // 클라이언트는 연결을 종료 할 때까지 0 복귀 값에 의해 표시된 수신 
                INT totalBytesEchoed = 0 ;
                반면 ((bytesRcvd = netStream.Read (rcvBuffer, 0 , rcvBuffer.Length))> 0 ) 
                { 
                    netStream.Write (rcvBuffer, 0 , bytesRcvd); 
                    totalBytesEchoed + = bytesRcvd; 
                } 
                Console.WriteLine는 ( " 에코 {0} 바이트. ", totalBytesEchoed); 

                // 스트림과 소켓을 닫습니다. 우리는이 클라이언트에 완료! 
                netStream.Close (); 
                client.Close (); 
            } 
            캐치 (예외 전자) 
            { 
                Console.WriteLine (e.Message); 
                netStream.Close (); 
            } 
        } 
    } 
}

TcpListener 생성자에 지정된 포트에서 클라이언트 연결 요청을 수신합니다.

다른 응용 프로그램에서 사용하지 않는, 또는 SocketException이가 발생합니다 포트를 사용하도록주의하십시오.

루프 영원히 반복적으로 들어오는 연결을 처리.

수신 클라이언트가 닫힐 때까지 데이터를 반복합니다.

클라이언트 스트림과 소켓을 닫습니다.

 

TcpEchoClient.cs

사용하여 시스템; // 문자열, INT32, 콘솔, ArgumentException이 들어 
사용 System.Text를; // 인코딩에 
사용 System.IO를; // 예외 : IOException가 
사용 System.Net.Sockets을; // 하여 TcpClient,는 NetworkStream, SocketException 사용을 위해 

클래스 TcpEchoClient 
{ 
    정적  무효 메인 ( 문자열 []에 args) 
    { 
        경우 ((args.Length < 2 ) || (args.Length> 3 )) 
        { 
            // 인수의 정확한 번호 테스트 
            던져  새로운 ArgumentException이 (" 매개 변수 : <서버> <말씀> [<포트>] " ); 
        } 
        
        문자열 서버 = 인수 [ 0 ]; // 서버 이름 또는 IP 주소 

        // 바이트로 변환하는 입력 문자열 
        바이트 []의 ByteBuffer = Encoding.ASCII.GetBytes (인수 [ 1 ]); 

        // 사용 포트 인수를 제공하는 경우, 그렇지 않으면 7에 기본 
        INT의 = servPort (args.Length == 3 )? 에서 Int32.Parse (인수 [ 2 ]) (7) ; 

        하여 TcpClient 클라이언트 = 널 (null) ; 
        NetStream을는 NetworkStream = ; 

        시험 
        { 
            // 지정된 포트에서 서버에 연결된 소켓 만들기 
            클라이언트 = 새로운 하여 TcpClient (서버, servPort를); 
            (Console.WriteLine " 서버에 연결 ... 에코 문자열을 보내 " ); 
            NetStream을 = client.GetStream (); 

            // 서버에 상기 인코딩 된 문자열을 송신 
            netStream.Write (ByteBuffer를, 0 , byteBuffer.Length); 
            Console.WriteLine는 ( " 보낸 {0} 서버에 바이트 ... " , byteBuffer.Length을);
            INT totalBytesRcvd = 0 ; //총 바이트가 지금까지받은 
            INT bytesRcvd = 0 ; // 바이트 판독 마지막으로 수신 

            // 서버에서 다시 동일한 문자열을 수신 
            하면서 (totalBytesRcvd < byteBuffer.Length) 
            { 
                경우 ((bytesRcvd = netStream.Read (ByteBuffer를, totalBytesRcvd, byteBuffer.Length - totalBytesRcvd)) == 0 ) 
                { 
                    Console.WriteLine는 ( " 연결 조기 폐쇄. " );
                    휴식 ; 
                } 
                totalBytesRcvd + = bytesRcvd;
            }
            Console.WriteLine는 ( " 수신 {0} 서버 바이트 {1} " , totalBytesRcvd, 
            (ByteBuffer를, Encoding.ASCII.GetString 0 , totalBytesRcvd)); 
        } 
        캐치 (예외 전자) 
        { 
            Console.WriteLine (e.Message); 
        } 
        마지막  
        { 
            netStream.Close (); 
            client.Close (); 
        } 
    } 
}

 

HTTPS : //www.cnblogs.com/davidgu/p/4717426.html 재현

추천

출처blog.csdn.net/weixin_34085658/article/details/93802991