본문 바로가기

TCPClient & TCPListener


내부적으로 System.Net.Sockets.Socket 클래스를 사용한다.

하지만 Socket 으로 작업하는 것보다 훨씬 간결하다.

 

 

네트워크 데이터 송수신은 기본적으로 바이트 자료형을 사용한다.

따라서 문자열을 보낼 경우 먼저 바이트로 인코딩한 후, 일반 영문은 ASCII로 인코딩하고, 한글 등 비영문 문자열은 UTF8 인코딩을 사용한다.

 

 

실행 흐름

TCPClient.zip
0.18MB
TCPServer.zip
0.18MB

TCPListener 

  • Server의 Listen( ) 동작을 의미한다.
using System.Net.Sockets;
using System.Net;

namespace TcpServerTest
{
    class Program
    {
        static void Main(string[] args)
        {
            // [1] 서버의 Listen 동작을 바로 실행 할 수 있다.
            IPEndPoint ipt = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7000);
            TcpListener listener = new TcpListener(ipt);

            // [2] "서버" 클라가이언트의 접속 요청을 대기하도록 명령
            listener.Start();

            // 버퍼 준비
            byte[] receiverBuff = new byte[2048];

            while (true)
            {
                // [4] 대기중인 서버 소켓이 Aceept()를 실행하고, 서버는 클라이언트와 연결이 성공된 소켓을 하나 더 만든다.
                TcpClient Connected_TCPClient = listener.AcceptTcpClient();

                // TcpClient 객체에서 TCP 네트워크 스트림을 가져와서 사용하도록 한다
                NetworkStream stream = Connected_TCPClient.GetStream();

                // [5] 데이터 수신
                int nbytes;
                while ((nbytes = stream.Read(receiverBuff, 0, receiverBuff.Length)) > 0)
                {
                    // 데이터 송신, 받은것을 다시 보낸다.(Echo)
                    stream.Write(receiverBuff, 0, nbytes);
                }

                // [6] 연결된 소켓을 닫는다.
                stream.Close();
                Connected_TCPClient.Close();

                // 계속 반복
            }
        }
    }
}

TCPClient

using System;
using System.Net.Sockets;
using System.Text;

namespace TcpClientTest
{
    class Program
    {
        static void Main(string[] args)
        {

            // [1] 접속 할 서버의 IP, PORT 정보넘겨받아 바로 연결한다.
            TcpClient tc = new TcpClient("127.0.0.1", 7000);

            // [2] 송수신

            // 송신 할 문장 준비
            string msg = "안녕하세요. TCPClient & TCPListener 사용 테스트입니다.";
            byte[] buff = Encoding.UTF8.GetBytes(msg);

            // 보낸다
            NetworkStream stream = tc.GetStream();
            stream.Write(buff, 0, buff.Length);

            // 받는다.
            byte[] receiverBuff = new byte[2048];
            int nbytes = stream.Read(receiverBuff, 0, receiverBuff.Length);
            string output = Encoding.UTF8.GetString(receiverBuff, 0, nbytes);

            // [3] 닫는다.
            stream.Close();
            tc.Close();

            Console.WriteLine($"{nbytes} bytes: {output}");
        }
    }
}

 

BasicLike

어? 나 프로그래밍 좋아하네?