using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Configuration;
namespace Mesnac.Communication
{
public class SocketClient : IDisposable
{
private static SocketClient instance = null;
///
/// 客户端连接Socket
///
private Socket clientSocket;
///
/// 连接状态
///
private Boolean connected = false;
///
/// 连接点
///
private IPEndPoint hostEndPoint;
///
/// 连接信号量
///
private static AutoResetEvent autoConnectEvent = new AutoResetEvent(false);
///
/// 接受到数据时的委托
///
///
public delegate void ReceiveMsgHandler(string info);
///
/// 接收到数据时调用的事件
///
public event ReceiveMsgHandler OnMsgReceived;
///
/// 开始监听数据的委托
///
public delegate void StartListenHandler();
///
/// 开始监听数据的事件
///
public event StartListenHandler StartListenThread;
///
/// 发送信息完成的委托
///
///
public delegate void SendCompleted(bool successorfalse);
///
/// 发送信息完成的事件
///
public event SendCompleted OnSended;
///
/// 监听接收的SocketAsyncEventArgs
///
private SocketAsyncEventArgs listenerSocketAsyncEventArgs;
///
/// 监听线程
///
Thread receiveThread = null;
public static string hostName;
public static int port;
///
/// TCP通信服务实例
///
public static SocketClient Instance
{
get
{
if (instance == null)
{
instance = new SocketClient();
}
return instance;
}
}
///
/// 启动服务
///
public static void StartService()
{
if (instance == null)
{
instance = new SocketClient();
}
}
///
/// 初始化客户端
///
/// 服务端地址{IP地址}
/// 端口号
public SocketClient()//String hostName, Int32 port
{
object listenServerIP = ConfigurationManager.AppSettings["ListenServerIP"];
string oport = ConfigurationManager.AppSettings["Port"].ToString();
string hostName = listenServerIP.ToString();
int port = 0;
int.TryParse(oport, out port);
IPHostEntry host = Dns.GetHostEntry(hostName);
IPAddress[] addressList = host.AddressList;
this.hostEndPoint = new IPEndPoint(addressList[addressList.Length - 1], port);
this.clientSocket = new Socket(this.hostEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
//Connect();
}
///
/// 连接服务端
///
public bool Connect()
{
SocketAsyncEventArgs connectArgs = new SocketAsyncEventArgs();
connectArgs.UserToken = this.clientSocket;
connectArgs.RemoteEndPoint = this.hostEndPoint;
connectArgs.Completed += new EventHandler(OnConnect);
clientSocket.ConnectAsync(connectArgs);
//等待连接结果
autoConnectEvent.WaitOne();
SocketError errorCode = connectArgs.SocketError;
if (errorCode == SocketError.Success)
{
listenerSocketAsyncEventArgs = new SocketAsyncEventArgs();
byte[] receiveBuffer = new byte[32768];
listenerSocketAsyncEventArgs.UserToken = clientSocket;
listenerSocketAsyncEventArgs.SetBuffer(receiveBuffer, 0, receiveBuffer.Length);
listenerSocketAsyncEventArgs.Completed += new EventHandler(OnReceive);
StartListenThread += new SocketClient.StartListenHandler(listener_StartListenThread);
StartListenThread();
return true;
}
else
//throw new SocketException((Int32)errorCode);
return false;
}
private void listener_StartListenThread()
{
ICSharpCode.Core.LoggingService.Debug("开始侦听...");
//receiveThread = new Thread(new ThreadStart(Listen));
Listen();
}
///
/// 开始监听线程的入口函数
///
public void Listen()
{
(listenerSocketAsyncEventArgs.UserToken as Socket).ReceiveAsync(listenerSocketAsyncEventArgs);
}
///
/// 停止监听线程
///
public void StopListenThread()
{
//receiveThread.Abort();
if (clientSocket != null)
clientSocket.Close();
clientSocket = null;
Dispose();
}
///
/// 发送信息
///
///
public void Send(String message)
{
if (this.connected)
{
message = String.Format("[length={0}]{1}", message.Length, message);
Byte[] sendBuffer = Encoding.Unicode.GetBytes(message);
SocketAsyncEventArgs senderSocketAsyncEventArgs = new SocketAsyncEventArgs();
senderSocketAsyncEventArgs.UserToken = this.clientSocket;
senderSocketAsyncEventArgs.SetBuffer(sendBuffer, 0, sendBuffer.Length);
senderSocketAsyncEventArgs.RemoteEndPoint = this.hostEndPoint;
senderSocketAsyncEventArgs.Completed += new EventHandler(OnSend);
clientSocket.SendAsync(senderSocketAsyncEventArgs);
}
else
{
throw new SocketException((Int32)SocketError.NotConnected);
}
}
///
/// 断开连接
///
public void Disconnect()
{
clientSocket.Disconnect(false);
}
///
/// 连接的完成方法
///
///
///
private void OnConnect(object sender, SocketAsyncEventArgs e)
{
autoConnectEvent.Set();
this.connected = (e.SocketError == SocketError.Success);
}
///
/// 接收的完成方法
///
///
///
private void OnReceive(object sender, SocketAsyncEventArgs e)
{
string msg = Encoding.Default.GetString(e.Buffer, 0, e.BytesTransferred);
ICSharpCode.Core.LoggingService.Info("接收到数据" + msg);
//Console.WriteLine("接收到数据"+msg);
Listen();
if (OnMsgReceived != null)
OnMsgReceived(msg);
}
///
/// 发送的完成方法
///
///
///
private void OnSend(object sender, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
OnSended(true);
}
else
{
OnSended(false);
this.ProcessError(e);
}
}
///
/// 处理错误
///
///
private void ProcessError(SocketAsyncEventArgs e)
{
Socket s = e.UserToken as Socket;
if (s.Connected)
{
try
{
s.Shutdown(SocketShutdown.Both);
}
catch (Exception)
{
//client already closed
}
finally
{
if (s.Connected)
{
s.Close();
}
}
}
throw new SocketException((Int32)e.SocketError);
}
#region IDisposable Members
public void Dispose()
{
autoConnectEvent.Close();
if (clientSocket != null && this.clientSocket != null)
{
if (this.clientSocket.Connected)
{
this.clientSocket.Close();
}
}
}
#endregion
}
}