-
소켓 프로그래밍 (네트워크) #3C# 예제 공부일기 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 데이터를 주고받는다.
'C# 예제 공부일기' 카테고리의 다른 글
미니프로젝트 정리 (조원파트) Login Form (0) 2020.07.31 Thread (0) 2020.07.31 외부에서 MariaDB 접속하기 (0) 2020.07.31 RaspberryPi : 파이썬 MariaDB 서버 커넥션 (0) 2020.07.30 RaspberryPi : MariaDB 설치 및 활용 (0) 2020.07.30