DS 's RoOm
김도선님의 블로그입니다
2012년 12월 19일 수요일
Socket(Tcp) 비동기 Client
public class AsyncClient { private Socket hSock; private Socket ConnSock; private byte[] m_ReceiveByte; private const int MAXSIZE = 1024; private string HOST = "127.0.0.1"; private int PORT = 9999; public AsyncClient() { hSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); m_ReceiveByte = new byte[MAXSIZE]; } //########################## // Connet public void BeginConnect() { Console.WriteLine("서버로 접속 대기중입니다......."); try { hSock.BeginConnect(HOST, PORT, new AsyncCallback(ConnectCallBack), hSock); } catch (SocketException se) { Console.WriteLine("서버에 접속 실패했습니다... {0} , {1}", se.Message, se.SocketErrorCode); } } // CallBack COnnect private void ConnectCallBack(IAsyncResult ar) { try { // 보류중인 연결을 완성 Socket s = (Socket)ar.AsyncState; IPEndPoint serEP = (IPEndPoint)s.RemoteEndPoint; Console.WriteLine("서버로 접속 성공..... serverIP: {0}, Port: {1}", serEP.Address, serEP.Port); s.EndConnect(ar); ConnSock = s; ConnSock.BeginReceive(this.m_ReceiveByte, 0, m_ReceiveByte.Length, SocketFlags.None, new AsyncCallback(OnReceiveCallBack), ConnSock); } catch (SocketException se) { if (se.SocketErrorCode == SocketError.NotConnected) { Console.WriteLine("서버에 접속 실패했습니다... {0} , {1}", se.Message, se.SocketErrorCode); // 접속 실패시 연결 재호출 this.BeginConnect(); } } } // SEND public void BeginSend(string message) { try { // 연결 시 if (hSock.Connected) { Console.WriteLine("서버로 데이터 전송 준비... {0}", message); byte[] t_sendByte = new UTF8Encoding().GetBytes(message); hSock.BeginSend(t_sendByte, 0, t_sendByte.Length, SocketFlags.None, new AsyncCallback(SendCallBack), message); } } catch (SocketException e) { Console.WriteLine("Send Errorr {0}, {1}", e.Message, e.SocketErrorCode); } } // Send CallBack private void SendCallBack(IAsyncResult ar) { string Message = (string)ar.AsyncState; Console.WriteLine("서버로 데이터를 전송했습니다... Text: {0}", Message); } // Receive public void Receive() { ConnSock.BeginReceive(this.m_ReceiveByte, 0, m_ReceiveByte.Length, SocketFlags.None, new AsyncCallback(OnReceiveCallBack), ConnSock); } // Receive CallBack private void OnReceiveCallBack(IAsyncResult ar) { try { Socket t_Sock = (Socket)ar.AsyncState; int num_read = t_Sock.EndReceive(ar); if (num_read != 0) { string message = new UTF8Encoding().GetString(m_ReceiveByte, 0, num_read); Console.WriteLine(message); } this.Receive(); } catch (SocketException se) { if (se.SocketErrorCode == SocketError.ConnectionReset) { this.BeginConnect(); } } } } // AsyncClient CLose
댓글 없음:
댓글 쓰기
최근 게시물
이전 게시물
홈
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기