상단의 View 메뉴에서, ToolBox 를 선택합니다.ToolBox 에서 Button(버튼)을 검색하여, 폼 위에 올려리고, 버튼을 <더블클릭>합니다.버튼 이벤트가 생성됩니다.참고: 코드보기(F7)
public void AcceptIncomingSocket()
{
// (1) 서버 소켓 생성
Socket listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// IP 및 포트 설정
IPAddress ipaddr = IPAddress.Any;
IPEndPoint ipep = new IPEndPoint(ipaddr, 23000);
// (2) 소켓 바인딩
listenerSocket.Bind(ipep);
// (3) 연결 요청 대기 상태로 전환
listenerSocket.Listen(5);
Console.WriteLine("클라이언트 연결을 대기 중입니다...");
//Debug.WriteLine("클라이언트 연결을 대기 중입니다...");
// (4) 클라이언트 연결 수락
Socket client = listenerSocket.Accept();
Console.WriteLine($"클라이언트가 연결되었습니다: {client.RemoteEndPoint}");
}
서버 구현에 필요한 최소한의 구조를 구현한다.버튼을 누르면, 동기화된 로직에서 UI 가 멈추는 것을 확인한다.
public async Task AcceptIncomingSocket()
{
// (1) 서버 소켓 생성
Socket listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// IP 및 포트 설정
IPAddress ipaddr = IPAddress.Any;
IPEndPoint ipep = new IPEndPoint(ipaddr, 23000);
// (2) 소켓 바인딩
listenerSocket.Bind(ipep);
// (3) 연결 요청 대기 상태로 전환
listenerSocket.Listen(5);
Console.WriteLine("클라이언트 연결을 대기 중입니다...");
// (4) 클라이언트 연결 수락
Socket client = await listenerSocket.AcceptAsync();
Console.WriteLine($"클라이언트가 연결되었습니다: {client.RemoteEndPoint}");
}
private async void button1_Click(object sender, System.EventArgs e)
{
await AcceptIncomingSocket();
}
Task 네임스페이스 추가버튼 이벤트 비동기로 변경 (이벤트 핸들러는 예외를 전파하지 않기 때문에 async void 가 유일하게 허용됩니다.)함수이름에 비동기 키워드 추가버튼을 눌렀을 때, 동작한는 함수의 로직은, UI와 별도의 로직 흐름을 가진 비동기 흐름이 된다.