using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System; using System.Collections; using System.Net; using System.Text; using System.Threading; using System.Net.Sockets; namespace SA_LTT.Base { public class SocketClient { #region Property /// /// Client socket /// private Socket sock; /// /// Receive event handler /// private ReceiveEventHandler RecevedHandler; /// /// Server ip to be connected /// public IPAddress Ip { get; private set; } /// /// Server port to be connected /// public int Port { get; private set; } /// /// Client name /// public string Name { get; private set; } public bool isConnected { get { return sock == null ? false : sock.Connected; } } #endregion #region Construct /// /// Socket client construct /// /// Server ip to be connected /// Server port to be connected public SocketClient() { this.Ip = IPAddress.Parse("127.0.0.1"); this.Port = 8000; this.Name = string.Empty; RecevedHandler = new ReceiveEventHandler(); } #endregion #region Fuction public void ChangeAddress(IPAddress ip, int port) { if (isConnected) { Disconnect(); } this.Ip = ip; this.Port = port; } /// /// Connect to server /// /// public bool Connect() { try { if (sock == null) sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); else if (sock.Connected) throw new Exception("socket is already connected."); else { sock.Close(); sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); } IPEndPoint ipep = new IPEndPoint(Ip, Port); IAsyncResult async_result = sock.BeginConnect(ipep, new AsyncCallback(ConnectedCallback), sock); if (async_result.AsyncWaitHandle.WaitOne(5000, false)) { return true; } else { sock.Close(); sock = null; return false; } } catch (Exception ex) { return false; } } /// /// Add received Event /// /// Received event /// public bool Add_received_event(ReceivedEvent Received_event) { try { RecevedHandler.ReceiveEvent += Received_event; return true; } catch (Exception ex) { return false; } } /// /// Disconnect to server /// public void Disconnect() { try { if (sock == null) throw new Exception("socket is already disconnected"); this.sock.Close(); sock.Dispose(); sock = null; } catch (Exception ex) { } } /// /// Async connected call back /// /// private void ConnectedCallback(IAsyncResult ar) { try { Socket client = (Socket)ar.AsyncState; if (!client.Connected) return; client.EndConnect(ar); sock = client; StateObject so = new StateObject(sock); so.workSocket.BeginReceive(so.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(RecieveCallback), so); } catch (Exception ex) { } } /// /// Async receieve call back /// /// private void RecieveCallback(IAsyncResult ar) { try { StateObject so = (StateObject)ar.AsyncState; if (!so.workSocket.Connected) return; int byteread = so.workSocket.EndReceive(ar); if (byteread > 0) { so.Received_data.Append(Encoding.ASCII.GetString(so.buffer, 0, byteread)); RecevedHandler.OnReceived(so); StateObject so2 = new StateObject(so.workSocket); so.workSocket.BeginReceive(so2.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(RecieveCallback), so2); } } catch (Exception ex) { } } /// /// Send data /// /// /// /// public bool SendData(string data) { try { byte[] buffer = Encoding.Default.GetBytes(data); sock.BeginSend(buffer, 0, buffer.Length, 0, new AsyncCallback(SendCallback), sock); return true; } catch (Exception ex) { return false; } } /// /// Send data /// /// /// public bool SendData(byte[] data) { try { sock.BeginSend(data, 0, data.Length, 0, new AsyncCallback(SendCallback), sock); return true; } catch (Exception ex) { return false; } } /// /// Async Send call back /// /// public void SendCallback(IAsyncResult ar) { try { Socket sock = (Socket)ar.AsyncState; int byteSent = sock.EndSend(ar); } catch (Exception ex) { } } #endregion } public delegate void ReceivedEvent(object obj, ReceiveEventArgs e); public class ReceiveEventHandler { /// /// Recevied event /// public event ReceivedEvent ReceiveEvent; /// /// Invoke an ReceiveEvent /// /// StateObject after received public virtual void OnReceived(StateObject so) { if (ReceiveEvent != null) { ReceiveEvent(this, new ReceiveEventArgs(so)); } } } public class ReceiveEventArgs : EventArgs { public StateObject stateobject { get; private set; } /// /// Socket이 Received 되었을때 사용 /// /// Received 된 후의 StateObject 값 public ReceiveEventArgs(StateObject stateobject) { this.stateobject = stateobject; } } public class StateObject { /// /// Received Sockect /// public Socket workSocket = null; /// /// Maximum size that can be received /// public const int BufferSize = 256; /// /// Received buffer /// public byte[] buffer = new byte[BufferSize]; /// /// Received data string /// public StringBuilder Received_data = new StringBuilder(); public StateObject(Socket sock) { workSocket = sock; } } }