프로그램 설명
클라이언트가 연결을 끊을 시에 서버에서 인지를 하고 서버 프로그램도 같이 종료되는 프로그램입니다.
윈도우 폼 형식으로 작성을 했으며, 실제 테스트를 하기 위해서는 클라이언트 프로그램을 실행하고 메시지를 주고 받은 후, 팝업 창의 X 버튼을 눌러서 프로그램을 종료하는 것으로 합니다.
확인을 위해서 각 단계별로 메시지를 보여 주었습니다.
실행 후
메시지 전송 후
프로그램 작성 순서
1. 소켓/쓰레드과 관련한 네임스페이스를 서버/클라이언트 모두에 포함 시킵니다.
using System.Net; using System.Net.Sockets; using System.Threading;
2. 서버 프로그램
Socket sock; Socket acc; public MainForm() { InitializeComponent(); } Socket socket() { return new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); } private void button1_Click(object sender, EventArgs e) { sock = socket(); sock.Bind(new IPEndPoint(0, 3)); sock.Listen(0); new Thread(delegate() { acc = sock.Accept(); MessageBox.Show("서버: CONNECTION ACCEPTED!"); sock.Close(); while(true) { try { byte[] buffer = new byte[255]; int rec = acc.Receive(buffer, 0, buffer.Length, SocketFlags.None); if (rec <= 0) { throw new SocketException(); } Array.Resize(ref buffer, rec); Invoke((MethodInvoker)delegate { listBox1.Items.Add(Encoding.UTF8.GetString(buffer)); }); } catch { MessageBox.Show("서버: DISCONNECTION!"); acc.Close(); acc.Dispose(); break; } } Application.Exit(); }).Start(); } private void button2_Click(object sender, EventArgs e) { try { byte[] data = Encoding.UTF8.GetBytes(textBox1.Text); acc.Send(data, 0, data.Length, 0); } catch(SocketException ex) { MessageBox.Show(ex.Message.ToString()); } }
3. 클라이언트 프로그램
Socket sock; public MainForm() { InitializeComponent(); sock = socket(); FormClosing += new FormClosingEventHandler(MainForm_FormClosing); } void MainForm_FormClosing(object sender, FormClosingEventArgs e) { sock.Close(); } Socket socket() { return new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); } void read() { while (true) { try { byte[] buffer = new byte[255]; int rec = sock.Receive(buffer, 0, buffer.Length, SocketFlags.None); if (rec <= 0) { throw new SocketException(); } Array.Resize(ref buffer, rec); Invoke((MethodInvoker)delegate { listBox1.Items.Add(Encoding.UTF8.GetString(buffer)); }); } catch { MessageBox.Show("클라이언트: DISCONNECTION"); sock.Close(); break; } } Application.Exit(); } private void btn_connect_Click(object sender, EventArgs e) { try { sock.Connect(new IPEndPoint(IPAddress.Parse(textBox1.Text), 3)); new Thread(() => { read(); }).Start(); } catch { MessageBox.Show("클라이언트: CONNECTION FAILED!"); } } private void btn_send_Click(object sender, EventArgs e) { byte[] data = Encoding.UTF8.GetBytes(textBox2.Text); sock.Send(data, 0, data.Length, SocketFlags.None); }
'C# with TCP/IP' 카테고리의 다른 글
[Program C#]동기 서버/클라이언트 msdn 예제 - 콘솔 버전 (0) | 2014.12.23 |
---|---|
[Program C#]Socket 통신 - 버퍼 사이즈보다 많은 양의 데이타를 받을 시 (0) | 2014.12.23 |
[Program C#]Socket 통신 - 기본 (1) | 2014.12.23 |
[Program C#]Socket 통신 - 예제 (0) | 2014.12.23 |
Socket 시스템 호출 명령 (0) | 2014.12.23 |