2015. 1. 6. 15:43
C# with TCP/IP
프로그램 설명
다중 접속과 데이타 전송 및 클라이언트에서 소켓 해제시 서버에서 인지를 하고 접속한 클라이언트 소켓을 해제하는 예제입니다.
구조는 서버에서 listen socket 을 생성하고, 각각의 클라이언트 접속시 client class 를 만들어서 리스트뷰에서 현재 상태의 소켓 상태와 메시지를 보여 주는 구조입니다.
서버 구현시 사용한 listen class, client class 파일 올립니다.
클라이언트에서는 소켓을 해제하는 단계를 거칩니다.
실행 후
메시지 전송 후
클라이언트 접속 해제 후
프로그램 설명
1. 소켓/쓰레드과 관련한 네임스페이스를 서버/클라이언트 모두에 포함 시킵니다.
using System.Net; using System.Net.Sockets; using System.Threading; using System.Diagnostics;
2. 서버 프로그램
Listener listener; public Main() { InitializeComponent(); int port = Convert.ToInt32(Properties.Settings.Default.Port); listener = new Listener(port); listener.SocketAccepted += new Listener.SocketAcceptedHandler(listener_SocketAccepted); Load += new EventHandler(Main_Load); } void Main_Load(object sender, EventArgs e) { string tcpServerIP = Properties.Settings.Default.ServerIP; listener.Start(tcpServerIP); } void listener_SocketAccepted(System.Net.Sockets.Socket e) { Client client = new Client(e); client.Received += new Client.ClientReceivedHandler(client_Received); client.Disconnected += new Client.ClientDisconnectedHandler(client_Disconnected); Invoke((MethodInvoker)delegate { ListViewItem i = new ListViewItem(); i.Text = client.EndPoint.ToString(); i.SubItems.Add(client.ID); i.SubItems.Add("XX"); i.SubItems.Add("YY"); i.Tag = client; lstClient.Items.Add(i); }); } void client_Disconnected(Client sender) { Invoke((MethodInvoker)delegate { for (int i = 0; i < lstClient.Items.Count; i++) { Client client = lstClient.Items[i].Tag as Client; if (client.ID == sender.ID) { lstClient.Items.RemoveAt(i); break; } } }); } void client_Received(Client sender, byte[] data) { Invoke((MethodInvoker)delegate { for (int i = 0; i < lstClient.Items.Count; i++) { Client client = lstClient.Items[i].Tag as Client; if (client.ID == sender.ID) { lstClient.Items[i].SubItems[2].Text = Encoding.UTF8.GetString(data); lstClient.Items[i].SubItems[3].Text = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"); break; } } }); }
3. 클라이언트 프로그램
Socket sck; public Main() { InitializeComponent(); sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); } private void btnConnect_Click(object sender, EventArgs e) { string ServerIP = Properties.Settings.Default.ServerIP; string Port = Properties.Settings.Default.Port; IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(ServerIP), Convert.ToInt32(Port)); sck.Connect(remoteEP); lblInfo.Text = "Connected"; } private void btnSend_Click(object sender, EventArgs e) { int s = sck.Send(Encoding.UTF8.GetBytes(textBox1.Text)); if (s > 0) { lblInfo.Text = string.Format("{0} bytes data sent", s.ToString()); } } private void btnClose_Click(object sender, EventArgs e) { lblInfo.Text = "Not Connected...."; sck.Close(); sck.Dispose(); Close(); }
'C# with TCP/IP' 카테고리의 다른 글
[Program C#]TcpListener - TcpClient msdn 예제 - 윈도우 버전 (1) | 2015.01.13 |
---|---|
[Program C#]TcpListener - TcpClient msdn 예제 - 콘솔 버전 (0) | 2015.01.09 |
[Program C#]Socket 통신 - Multiple Connection/Accepting Connections (0) | 2015.01.03 |
[Program C#]비동기 서버/클라이언트 msdn 예제 - 윈도우 버전 (3) | 2015.01.02 |
[Program C#]비동기 서버/클라이언트 msdn 예제 - 콘솔 버전 (0) | 2014.12.26 |