ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 소켓 프로그래밍 (네트워크) #3
    C# 예제 공부일기 2020. 7. 31. 19:29

     

    NeNetworStream을 이용한 TCP 소켓 프로그래밍

     

    서버

    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    
    namespace Network6
    {
        class Program
        {
            static void Main(string[] args)
            {
                //Socket Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //Server.Bind(new IPEndPoint(IPAddress.Any, 7000));
                //한방에 쓰기
    
                TcpListener aTcpListener = new TcpListener(IPAddress.Any, 7000);
    
                aTcpListener.Start();
    
    
                TcpClient Client = aTcpListener.AcceptTcpClient();
    
                Console.WriteLine("Client Incomming");
    
                aTcpListener.Stop(); //손님 접대 끝
    
                NetworkStream aNetworkStream = new NetworkStream(Client.Client);
                //네트워크 스트림 생성
    
    
    
                byte[] Buffer= new byte[1024];
    
                int BufferCount = aNetworkStream.Read(Buffer, 0, Buffer.Length); //buffer, offset, size / 위치 , 1024개의 공간중에 시작점, 크기
    
                Console.WriteLine($"클라이언트가 전송한 데이터의 크기 : {BufferCount} ");
                Console.WriteLine($"클라이언트가 전송한 내용 {Encoding.UTF8.GetString(Buffer)}");
    
                
    
                Buffer = Encoding.UTF8.GetBytes("After One Hour I Can Go Home");
    
                aNetworkStream.Write(Buffer,0,Buffer.Length);
    
                Console.WriteLine("서버를 종료합니다...");
                aNetworkStream.Close();
                
            }
        }
    }
    

     

    앞선 내용에서는 Server.Send() 를 통해서 데이터를 보내고 Server.Receive()를 통해서 Buffer의 데이터를 주고 받았다면, 여기서는 TcpListener라는 클래스를 사용해서 통신한다. TcpListener 클래스 객체 aTcpListener 에 생성자로 앞선 예제에서 사용했던 IPAddress.Any와 포트 7000번을 Open해서 클라이언트와 데이터를 통신할 준비를 한다. aTcpListener.Start()메소드로 서버를 연다. 클라이언트를 접객하는 부분이 aTcpLitener이고 받은 클라이언트를 Accept해서 일을 할 부분은 TcpClient Client이다. 여기까지 진행이 됬다면 커넥션이 연결됬다는 의미이다. 따라서 "Client Incoming'"이란 연결성공메세지를 띄워주고 Client 접대가 끝났으니 aTcpListener.Stop()으로 aTcpListener를 종료한다, 

     

    NetworkStream aNetworkStream = new NetworkStream(Client.Client)로 생성자 부분에는 소켓이 들어간다.

    이 생성된 NetworkStream로 데이터를 주고받는 역할을 한다. 연결된 Client가 보낸 데이터는 aNetworkStream.Read(buffer, offset , size)로 받고 보내는 부분은 aNetworkStream.Write(Buffer, offset , size)로 전송한다.

     

     

     

     

    클라이언트

    static void Main(string[] args)
            {
                TcpClient aTcpClient = new TcpClient();
    
                aTcpClient.Connect(new IPEndPoint(IPAddress.Parse("192.168.0.105"), 7000));
    
    
                Console.WriteLine("서버에 접속합니다.");
    
                NetworkStream aNetworkStream = new NetworkStream(aTcpClient.Client);
                //네트워크 스트림 생성
    
                 
    
                byte[] Buffer = Encoding.UTF8.GetBytes("클라이언트가 보냅니다");
                aNetworkStream.Write(Buffer, 0, Buffer.Length);
    
                Console.Write("클라이언트가 전송한 데이터 : {0}", Encoding.UTF8.GetString(Buffer));
                Buffer = new byte[1024];
                Console.WriteLine();
    
    
                int Data_Count=aNetworkStream.Read(Buffer, 0, Buffer.Length);
                Console.Write("서버가 전송한 데이터 : ");
                Console.WriteLine(Encoding.UTF8.GetString(Buffer, 0, Buffer.Length));
    
                Console.WriteLine();
                Console.WriteLine("연결을 종료합니다");
    
                aNetworkStream.Close();
                
            }

    Server에서 조금 첨삭한 클라이언트 부분에서는 TcpClient클래스의 객체 aTcpClient를 생성하고 aTcpClient,Connect 메소드를 통해서 접속할 서버의 IP주소와 포트번호로 접속한다. 뒷 부분은 서버와 마찬가지로 aNetworkStream.Write과 aNetworkStream.Read로 Buffer 데이터를 주고받는다.

     

     

Designed by Tistory.