Table of Content
TcpListener, TcpClient 클래스
- TcpListener: 서버 애플리케이션에서 사용. 클라이언트의 연결 요청 대기
- TcpClient: 서버 및 클라이언트 애플리케이션 양쪽에서 사용
- 클라이언트 쪽: 서버에 연결 요청
- 서버 쪽: 클라이언트의 연결 요청 수락 후 통신에 사용할 TcpClient 인스턴스 반환
- NetworkSteam: 서버와 클라이언트 간 데이터를 주고받는 스트림
- TcpClient.GetStream(): NetworkStream 객체 반환
- NetworkStream.Write(): 데이터 보내기
- NetworkStream.Read(): 데이터 읽기
- NetworkStream.Close(), TcpClient.Close(): 연결 종료
간단한 메아리 서버
class Program { public static void Main(string[] args) { string bindIp = "127.0.0.1"; // 루프백 주소 const int bindPort = 10000; //포트 IPEndPoint localAddress; TcpListener server = null; try { /* IPEndPoint 객체: IP 통신에 필요한 IP주소와 포트 표현 */ localAddress = new IPEndPoint(IPAddress.Parse(bindIp), bindPort); /* TcpListener객체: 클라이언트의 연결 요청 대기 */ server = new TcpListener(localAddress); /* 클라이언트의 TcpClient.Connect()에 의한 연결 요청 대기 */ server.Start(); Console.WriteLine("메아리 서버 시작"); while (true) { /* AcceptTcpClient(): 클라이언트의 연결 요청이 있기 전까지 대기 * 연결 요청이 오면 TcpClient 객체 반환 */ TcpClient client = server.AcceptTcpClient(); Console.WriteLine("클라이언트 접속: {0}", ndPoint)client.Client.RemoteEndPoint).ToString()); /* 클라이언트와 통신하기 위한 NetworkStream 객체 생성 */ NetworkStream stream = client.GetStream(); int length; string data = null; byte[] bytes = new byte[256]; /* 스트림으로부터 데이터를 읽어옴 */ while((length = stream.Read(bytes, 0, bytes.Length)) != 0) { data = Encoding.Default.GetString(bytes, 0, length); Console.WriteLine("수신: {0}", data); /* 데이터를 그대로 클라이언트로 보냄 */ byte[] msg = Encoding.Default.GetBytes(data); stream.Write(msg, 0, msg.Length); Console.WriteLine("송신: {0}", data); } stream.Close(); client.Close(); } } catch(SocketException e) { Console.WriteLine(e); } finally { server.Stop(); } } }
간단한 메아리 클라이언트 예제
class Program { static void Main(string[] args) { if (args.Length < 1) { Console.WriteLine("사용법: {0} <Message>", Process.GetCurrentProcess().ProcessName); return; } string bindIp = "127.0.0.1"; // 클라이언트 IP int bindPort = Convert.ToInt32(0); // 클라이언트 포트. 매개변수로 0을 넘기면 포트 자동 할당 string serverIp = "127.0.0.1"; // 서버 IP const int serverPort = 10000; // 서버 포트 string message = args[0]; try { /* IPEndPoint 객체: IP 통신에 필요한 IP주소와 포트 표현 */ IPEndPoint clientAddress = new IPEndPoint(IPAddress.Parse(bindIp), bindPort); IPEndPoint serverAddress = new IPEndPoint(IPAddress.Parse(serverIp), serverPort); Console.WriteLine("클라이언트: {0}, 서버: {1}", clientAddress.ToString(), erAddress.ToString()); /* 서버 접속 */ TcpClient client = new TcpClient(clientAddress); client.Connect(serverAddress); /* 서버로 데이터 보내기 */ byte[] data = System.Text.Encoding.Default.GetBytes(message); NetworkStream stream = client.GetStream(); stream.Write(data, 0, data.Length); Console.WriteLine("송신: {0}", message); /* 서버로부터 데이터 읽기 */ data = new byte[256]; string responseData = ""; int bytes = stream.Read(data, 0, data.Length); responseData = Encoding.Default.GetString(data, 0, bytes); Console.WriteLine("수신: {0}", responseData); stream.Close(); client.Close(); } catch(SocketException e) { Console.WriteLine(e); } Console.WriteLine("클라이언트를 종료합니다."); } }