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 } }