2015. 3. 17. 15:41
C# with TCP/IP
프로그램 설명
실행 후
Connect 버튼 클릭 후
메시지 전송 후
프로그램 작성
1. handleClient.cs (서버에서 사용하는 클래스)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | 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. 서버 프로그램
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | 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. 클라이언트 프로그램
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 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 |