2015. 3. 17. 15:41
C# with TCP/IP
프로그램 설명
실행 후
Connect 버튼 클릭 후
메시지 전송 후
프로그램 작성
1. handleClient.cs (서버에서 사용하는 클래스)
class handleClient { TcpClient clientSocket = null; public Dictionary<Tcpclient, string> clientList = null; public void startClient(TcpClient clientSocket, Dictionary<Tcpclient, string> clientList) { this.clientSocket = clientSocket; this.clientList = clientList; Thread t_hanlder = new Thread(doChat); t_hanlder.IsBackground = true; t_hanlder.Start(); } public delegate void MessageDisplayHandler(string message, string user_name); public event MessageDisplayHandler OnReceived; public delegate void DisconnectedHandler(TcpClient clientSocket); public event DisconnectedHandler OnDisconnected; private void doChat() { NetworkStream stream = null; try { byte[] buffer = new byte[1024]; string msg = string.Empty; int bytes = 0; int MessageCount = 0; while (true) { MessageCount++; stream = clientSocket.GetStream(); bytes = stream.Read(buffer, 0, buffer.Length); msg = Encoding.Unicode.GetString(buffer, 0, bytes); msg = msg.Substring(0, msg.IndexOf("$")); if (OnReceived != null) OnReceived(msg, clientList[clientSocket].ToString()); } } catch (SocketException se) { Trace.WriteLine(string.Format("doChat - SocketException : {0}", se.Message)); if (clientSocket != null) { if (OnDisconnected != null) OnDisconnected(clientSocket); clientSocket.Close(); stream.Close(); } } catch (Exception ex) { Trace.WriteLine(string.Format("doChat - Exception : {0}", ex.Message)); if (clientSocket != null) { if (OnDisconnected != null) OnDisconnected(clientSocket); clientSocket.Close(); stream.Close(); } } } }
2. 서버 프로그램
public partial class MainForm : Form { TcpListener server = null; TcpClient clientSocket = null; static int counter = 0; public Dictionary<Tcpclient, string> clientList = new Dictionary<Tcpclient,string>(); public MainForm() { InitializeComponent(); // socket start Thread t = new Thread(InitSocket); t.IsBackground = true; t.Start(); } private void InitSocket() { server = new TcpListener(IPAddress.Any, 9999); clientSocket = default(TcpClient); server.Start(); DisplayText(">> Server Started"); while(true) { try { counter++; clientSocket = server.AcceptTcpClient(); DisplayText(">> Accept connection from client"); NetworkStream stream = clientSocket.GetStream(); byte[] buffer = new byte[1024]; int bytes = stream.Read(buffer, 0, buffer.Length); string user_name = Encoding.Unicode.GetString(buffer, 0, bytes); user_name = user_name.Substring(0, user_name.IndexOf("$")); clientList.Add(clientSocket, user_name); // send message all user SendMessageAll(user_name + " Joined ", "", false); handleClient h_client = new handleClient(); h_client.OnReceived += new handleClient.MessageDisplayHandler(OnReceived); h_client.OnDisconnected += new handleClient.DisconnectedHandler(h_client_OnDisconnected); h_client.startClient(clientSocket, clientList); } catch (SocketException se) { Trace.WriteLine(string.Format("InitSocket - SocketException : {0}", se.Message)); break; } catch (Exception ex) { Trace.WriteLine(string.Format("InitSocket - Exception : {0}", ex.Message)); break; } } clientSocket.Close(); server.Stop(); } void h_client_OnDisconnected(TcpClient clientSocket) { if (clientList.ContainsKey(clientSocket)) clientList.Remove(clientSocket); } private void OnReceived(string message, string user_name) { string displayMessage = "From client : " + user_name + " : " + message; DisplayText(displayMessage); SendMessageAll(message, user_name, true); } public void SendMessageAll(string message, string user_name, bool flag) { foreach(var pair in clientList) { Trace.WriteLine(string.Format("tcpclient : {0} user_name : {1}", pair.Key, pair.Value)); TcpClient client = pair.Key as TcpClient; NetworkStream stream = client.GetStream(); byte[] buffer = null; if(flag) { buffer = Encoding.Unicode.GetBytes(user_name + " says : " + message); } else { buffer = Encoding.Unicode.GetBytes(message); } stream.Write(buffer, 0, buffer.Length); stream.Flush(); } } private void DisplayText(string text) { if (richTextBox1.InvokeRequired) { richTextBox1.BeginInvoke(new MethodInvoker(delegate { richTextBox1.AppendText(text + Environment.NewLine); })); } else richTextBox1.AppendText(text + Environment.NewLine); } }
3. 클라이언트 프로그램
public partial class MainForm : Form { TcpClient clientSocket = new TcpClient(); NetworkStream stream = default(NetworkStream); string message = string.Empty; public MainForm() { InitializeComponent(); } private void btnSendText_Click(object sender, EventArgs e) { byte[] buffer = Encoding.Unicode.GetBytes(this.textBoxMessage.Text + "$"); stream.Write(buffer, 0, buffer.Length); stream.Flush(); } private void btnConnect_Click(object sender, EventArgs e) { clientSocket.Connect("192.168.0.12", 9999); stream = clientSocket.GetStream(); message = "Connected to Chat Server"; DisplayText(message); byte[] buffer = Encoding.Unicode.GetBytes(this.textBoxNickName.Text + "$"); stream.Write(buffer, 0, buffer.Length); stream.Flush(); Thread t_handler = new Thread(GetMessage); t_handler.IsBackground = true; t_handler.Start(); } private void GetMessage() { while(true) { stream = clientSocket.GetStream(); int BUFFERSIZE = clientSocket.ReceiveBufferSize; byte[] buffer = new byte[BUFFERSIZE]; int bytes = stream.Read(buffer, 0, buffer.Length); string message = Encoding.Unicode.GetString(buffer, 0, bytes); DisplayText(message); } } private void DisplayText(string text) { if (richTextBox1.InvokeRequired) { richTextBox1.BeginInvoke(new MethodInvoker(delegate { richTextBox1.AppendText(text + Environment.NewLine); })); } else richTextBox1.AppendText(text + Environment.NewLine); } }
'C# with TCP/IP' 카테고리의 다른 글
[Program C#]이미지 파일과 텍스트 전송 - 1 (0) | 2015.03.26 |
---|---|
[Program C#] SslStream 을 이용한 통신 방법 (1) | 2015.03.20 |
[Program C#] 서버-클라이언트 1:N 통신 (1) | 2015.03.14 |
[Program C#] Socket multiple port로 작업하기 (0) | 2015.03.12 |
[Program C#] 서버-클라이언트 1:1 통신 (0) | 2015.03.12 |