using System;
using System.Text;
using System.Net;
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;
}
}
}