DS 's RoOm
김도선님의 블로그입니다
2012년 12월 19일 수요일
Socket(Tcp) 동기 Client
c# Socket(Tcp) 클라이언트를 구현해봤습니다.
private Socket sock; private IPAddress serverIp; private int serverPort = 9999; private IPEndPoint ipep; private BackgroundWorker bwReceiver; private byte[] receivebyte; private int idx = 0; //constructor public LocalSocketClient() { receivebyte = new byte[1024]; serverIp = IPAddress.Parse("127.0.0.1"); serverPort = 9999; ipep = new IPEndPoint(serverIp, serverPort);// 서버 끝점 bwReceiver = new BackgroundWorker(); bwReceiver.WorkerSupportsCancellation = true; bwReceiver.DoWork += new DoWorkEventHandler(bw_Receiver); bwReceiver.RunWorkerCompleted += new RunWorkerCompletedEventHandler(DisconnectFromReciver); } private void DisconnectFromReciver(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled) { this.Connect(); } } public void Send(string str) { if (sock.Connected) { byte[] sendByte = new UTF8Encoding().GetBytes(str); //ASCIIEncoding.UTF8.GetBytes(buff) sock.Send(sendByte, sendByte.Length, SocketFlags.None); } } private void bw_Receiver(object sender, DoWorkEventArgs e) { string s_Receive = string.Empty; while (true) { Array.Clear(receivebyte, 0, receivebyte.Length); s_Receive = ""; try { if (sock.Connected) { int size = sock.Receive(receivebyte); Console.WriteLine("받은 데이터 글자수 : {0}", size); s_Receive = ASCIIEncoding.UTF8.GetString(receivebyte); this.Received(this, new ClientEventArgs(s_Receive.Trim('\0'))); } else { Console.WriteLine("서버가 닫혔습니다"); break; } } catch (SocketException se) { if (se.SocketErrorCode == SocketError.ConnectionReset) // 클라이언트로부터 접속이 끊긴다면 { Console.WriteLine("{0} Error code: {1}. Receiver BackgroundWork() ", se.Message, se.ErrorCode); e.Cancel = true; this.bwReceiver.CancelAsync(); break; } } } } public void Connect() { Console.WriteLine("서버 접속 중입니다..."); sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); while (true) { try { sock.Connect(ipep); // 접속 에러 발생시 catch문 이동 if (sock.Connected) // 접속 완료시 receive 백그라운드 작동 { this.IsConnected(this, new ClientEventArgs(true)); bwReceiver.RunWorkerAsync(); Console.WriteLine("서버 접속 완료 ===> \t Receive Background 작동"); break; } } catch (SocketException e) // 서버 접속 에러 발생시 { if (e.SocketErrorCode == SocketError.ConnectionRefused) { Console.WriteLine("서버 접속 실패 ===> \t 접속 대기중입니다."); } } } }// close ServerConnect // Evevent Fire Class public class ClientEventArgs : EventArgs { public bool IsConnected; public string Message; public ClientEventArgs(string str) { this.Message = str; } public ClientEventArgs(bool isconnect) { this.IsConnected = isconnect; } } public delegate void SendEventHandler(object sender, ClientEventArgs e); public event SendEventHandler SendDest; public delegate void ReceiveHandler(object sender, ClientEventArgs e); public event ReceiveHandler Received; public delegate void ConnectedEvnetHandler(object sender, ClientEventArgs e); public event ConnectedEvnetHandler IsConnected; }// close TCLIENT
댓글 없음:
댓글 쓰기
최근 게시물
이전 게시물
홈
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기