using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; using System.Threading; namespace demo.ClassHelper.NetOperate { class TcpClientHelper { private static System.Threading.ManualResetEvent TimeoutObject = new System.Threading.ManualResetEvent(false); public static Socket CreateTcpClient() { return new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); } public static bool ConnectToServer(Socket client, string ip, int port, int timeout = -1) { bool ret = false; try { if (client == null) { client = CreateTcpClient(); } client.SendTimeout = 300; client.Connect(IPAddress.Parse(ip), port); ret = client.Poll(-1, SelectMode.SelectWrite); if (ret) { ret = true; } } catch(Exception e) { string str = e.ToString(); DisConnectServer(client); } return ret; } public static void DisConnectServer(Socket client) { try { if (client != null) { //client.Shutdown(SocketShutdown.Both); client.Disconnect(true); } } catch { } } public static bool GetClientStatus(Socket client) { if (client==null) { return false; //return !((client.Client.Poll(1000, SelectMode.SelectRead) && (client.Client.Available == 0)) || !client.Client.Connected); } return client.Connected; } public static void Close(Socket client) { try { if (client != null) { client.Shutdown(SocketShutdown.Both); client.Close(); client.Dispose(); client = null; } } catch (SocketException ex) { throw ex; } } public static bool SendMsgToServer(Socket client, string msg, int timeOut = 0) { bool ret = false; try { client.SendTimeout = timeOut; int len = msg.Length; byte[] data = new byte[msg.Length]; data = Encoding.Default.GetBytes(msg); int retLen = client.Send(data); if (len == retLen) { ret = true; } } catch (System.Exception ex) { throw new Exception(ex.Message); } return ret; } public static bool SendMsgToServer(Socket client, byte[] msg, int timeOut = 0) { bool ret = false; try { client.SendTimeout = timeOut; int len = msg.Length; int retLen = client.Send(msg); if (len == retLen) { ret = true; } } catch (System.Exception ex) { throw new Exception(ex.Message); } return ret; } public static bool SendFileToServer(Socket client, string path, int timeOut = 0) { bool flag = false; try { client.SendTimeout = timeOut; client.SendFile(path); flag = true; } catch { } return flag; } public static bool ReceiveMsg(Socket client, byte[] buffer, int timeOut = 0) { bool ret = false; try { client.ReceiveTimeout = timeOut; int recvLen = client.Receive(buffer); if (recvLen > 0) { ret = true; } } catch (System.Exception ex) { throw new Exception(ex.Message); } return ret; } public static bool ReceiveMsg(Socket client, ref string msg, int timeOut = 0) { bool ret = false; byte[] buffer = new byte[5000]; try { client.ReceiveTimeout = timeOut; int receiveCount = client.Receive(buffer); if (receiveCount > 0) { ret = true; byte[] tempBuffer = new byte[receiveCount]; Buffer.BlockCopy(buffer, 0, tempBuffer, 0, receiveCount); msg = Encoding.Default.GetString(tempBuffer); } } catch (System.Exception ex) { throw new Exception(ex.Message); } return ret; } #region // /// // /// 异步TCP客户端 // /// // public class AsyncTcpClient : IDisposable // { // #region Fields // private TcpClient tcpClient; // private bool disposed = false; // private int retries = 0; // #endregion // #region Ctors // /// // /// 异步TCP客户端 // /// // /// 远端服务器终结点 // public AsyncTcpClient(IPEndPoint remoteEP) // : this(new[] { remoteEP.Address }, remoteEP.Port) // { // } // /// // /// 异步TCP客户端 // /// // /// 远端服务器终结点 // /// 本地客户端终结点 // public AsyncTcpClient(IPEndPoint remoteEP, IPEndPoint localEP) // : this(new[] { remoteEP.Address }, remoteEP.Port, localEP) // { // } // /// // /// 异步TCP客户端 // /// // /// 远端服务器IP地址 // /// 远端服务器端口 // public AsyncTcpClient(IPAddress remoteIPAddress, int remotePort) // : this(new[] { remoteIPAddress }, remotePort) // { // } // /// // /// 异步TCP客户端 // /// // /// 远端服务器IP地址 // /// 远端服务器端口 // /// 本地客户端终结点 // public AsyncTcpClient( // IPAddress remoteIPAddress, int remotePort, IPEndPoint localEP) // : this(new[] { remoteIPAddress }, remotePort, localEP) // { // } // /// // /// 异步TCP客户端 // /// // /// 远端服务器主机名 // /// 远端服务器端口 // public AsyncTcpClient(string remoteHostName, int remotePort) // : this(Dns.GetHostAddresses(remoteHostName), remotePort) // { // } // /// // /// 异步TCP客户端 // /// // /// 远端服务器主机名 // /// 远端服务器端口 // /// 本地客户端终结点 // public AsyncTcpClient( // string remoteHostName, int remotePort, IPEndPoint localEP) // : this(Dns.GetHostAddresses(remoteHostName), remotePort, localEP) // { // } // /// // /// 异步TCP客户端 // /// // /// 远端服务器IP地址列表 // /// 远端服务器端口 // public AsyncTcpClient(IPAddress[] remoteIPAddresses, int remotePort) // : this(remoteIPAddresses, remotePort, null) // { // } // /// // /// 异步TCP客户端 // /// // /// 远端服务器IP地址列表 // /// 远端服务器端口 // /// 本地客户端终结点 // public AsyncTcpClient( // IPAddress[] remoteIPAddresses, int remotePort, IPEndPoint localEP) // { // this.Addresses = remoteIPAddresses; // this.Port = remotePort; // this.LocalIPEndPoint = localEP; // this.Encoding = Encoding.Default; // if (this.LocalIPEndPoint != null) // { // this.tcpClient = new TcpClient(this.LocalIPEndPoint); // } // else // { // this.tcpClient = new TcpClient(); // } // Retries = 3; // RetryInterval = 5; // } // #endregion // #region Properties // /// // /// 是否已与服务器建立连接 // /// // public bool Connected { get { return tcpClient.Client.Connected; } } // /// // /// 远端服务器的IP地址列表 // /// // public IPAddress[] Addresses { get; private set; } // /// // /// 远端服务器的端口 // /// // public int Port { get; private set; } // /// // /// 连接重试次数 // /// // public int Retries { get; set; } // /// // /// 连接重试间隔 // /// // public int RetryInterval { get; set; } // /// // /// 远端服务器终结点 // /// // public IPEndPoint RemoteIPEndPoint // { // get { return new IPEndPoint(Addresses[0], Port); } // } // /// // /// 本地客户端终结点 // /// // protected IPEndPoint LocalIPEndPoint { get; private set; } // /// // /// 通信所使用的编码 // /// // public Encoding Encoding { get; set; } // #endregion // #region Connect // /// // /// 连接到服务器 // /// // /// 异步TCP客户端 // public AsyncTcpClient Connect() // { // if (!Connected) // { // // start the async connect operation // tcpClient.BeginConnect( // Addresses, Port, HandleTcpServerConnected, tcpClient); // } // return this; // } // /// // /// 关闭与服务器的连接 // /// // /// 异步TCP客户端 // public AsyncTcpClient Close() // { // if (Connected) // { // retries = 0; // tcpClient.Close(); // RaiseServerDisconnected(Addresses, Port); // } // return this; // } // #endregion // #region Receive // private void HandleTcpServerConnected(IAsyncResult ar) // { // try // { // tcpClient.EndConnect(ar); // RaiseServerConnected(Addresses, Port); // retries = 0; // } // catch (Exception ex) // { // ExceptionHandler.Handle(ex); // if (retries > 0) // { // Logger.Debug(string.Format(CultureInfo.InvariantCulture, // "Connect to server with retry {0} failed.", retries)); // } // retries++; // if (retries > Retries) // { // // we have failed to connect to all the IP Addresses, // // connection has failed overall. // RaiseServerExceptionOccurred(Addresses, Port, ex); // return; // } // else // { // Logger.Debug(string.Format(CultureInfo.InvariantCulture, // "Waiting {0} seconds before retrying to connect to server.", // RetryInterval)); // Thread.Sleep(TimeSpan.FromSeconds(RetryInterval)); // Connect(); // return; // } // } // // we are connected successfully and start asyn read operation. // byte[] buffer = new byte[tcpClient.ReceiveBufferSize]; // tcpClient.GetStream().BeginRead( // buffer, 0, buffer.Length, HandleDatagramReceived, buffer); // } // private void HandleDatagramReceived(IAsyncResult ar) // { // NetworkStream stream = tcpClient.GetStream(); // int numberOfReadBytes = 0; // try // { // numberOfReadBytes = stream.EndRead(ar); // } // catch // { // numberOfReadBytes = 0; // } // if (numberOfReadBytes == 0) // { // // connection has been closed // Close(); // return; // } // // received byte and trigger event notification // byte[] buffer = (byte[])ar.AsyncState; // byte[] receivedBytes = new byte[numberOfReadBytes]; // Buffer.BlockCopy(buffer, 0, receivedBytes, 0, numberOfReadBytes); // RaiseDatagramReceived(tcpClient, receivedBytes); // RaisePlaintextReceived(tcpClient, receivedBytes); // // then start reading from the network again // stream.BeginRead( // buffer, 0, buffer.Length, HandleDatagramReceived, buffer); // } // #endregion // #region Events // /// // /// 接收到数据报文事件 // /// // public event EventHandler> DatagramReceived; // /// // /// 接收到数据报文明文事件 // /// // public event EventHandler> PlaintextReceived; // private void RaiseDatagramReceived(TcpClient sender, byte[] datagram) // { // if (DatagramReceived != null) // { // DatagramReceived(this, // new TcpDatagramReceivedEventArgs(sender, datagram)); // } // } // private void RaisePlaintextReceived(TcpClient sender, byte[] datagram) // { // if (PlaintextReceived != null) // { // PlaintextReceived(this, // new TcpDatagramReceivedEventArgs( // sender, this.Encoding.GetString(datagram, 0, datagram.Length))); // } // } // /// // /// 与服务器的连接已建立事件 // /// // public event EventHandler ServerConnected; // /// // /// 与服务器的连接已断开事件 // /// // public event EventHandler ServerDisconnected; // /// // /// 与服务器的连接发生异常事件 // /// // public event EventHandler ServerExceptionOccurred; // private void RaiseServerConnected(IPAddress[] ipAddresses, int port) // { // if (ServerConnected != null) // { // ServerConnected(this, // new TcpServerConnectedEventArgs(ipAddresses, port)); // } // } // private void RaiseServerDisconnected(IPAddress[] ipAddresses, int port) // { // if (ServerDisconnected != null) // { // ServerDisconnected(this, // new TcpServerDisconnectedEventArgs(ipAddresses, port)); // } // } // private void RaiseServerExceptionOccurred( // IPAddress[] ipAddresses, int port, Exception innerException) // { // if (ServerExceptionOccurred != null) // { // ServerExceptionOccurred(this, // new TcpServerExceptionOccurredEventArgs( // ipAddresses, port, innerException)); // } // } // #endregion // #region Send // /// // /// 发送报文 // /// // /// 报文 // public void Send(byte[] datagram) // { // if (datagram == null) // throw new ArgumentNullException("datagram"); // if (!Connected) // { // RaiseServerDisconnected(Addresses, Port); // throw new InvalidProgramException( // "This client has not connected to server."); // } // tcpClient.GetStream().BeginWrite( // datagram, 0, datagram.Length, HandleDatagramWritten, tcpClient); // } // private void HandleDatagramWritten(IAsyncResult ar) // { // ((TcpClient)ar.AsyncState).GetStream().EndWrite(ar); // } // /// // /// 发送报文 // /// // /// 报文 // public void Send(string datagram) // { // Send(this.Encoding.GetBytes(datagram)); // } // #endregion // #region IDisposable Members // /// // /// Performs application-defined tasks associated with freeing, // /// releasing, or resetting unmanaged resources. // /// // public void Dispose() // { // Dispose(true); // GC.SuppressFinalize(this); // } // /// // /// Releases unmanaged and - optionally - managed resources // /// // /// true to release both managed // /// and unmanaged resources; false // /// to release only unmanaged resources. // /// // protected virtual void Dispose(bool disposing) // { // if (!this.disposed) // { // if (disposing) // { // try // { // Close(); // if (tcpClient != null) // { // tcpClient = null; // } // } // catch (SocketException ex) // { // ExceptionHandler.Handle(ex); // } // } // disposed = true; // } // } // #endregion // } //使用举例 //复制代码 //代码如下: //class Program // { // static AsyncTcpClient client; // static void Main(string[] args) // { // LogFactory.Assign(new ConsoleLogFactory()); // // 测试用,可以不指定由系统选择端口 // IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999); // IPEndPoint localEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9998); // client = new AsyncTcpClient(remoteEP, localEP); // client.Encoding = Encoding.UTF8; // client.ServerExceptionOccurred += // new EventHandler(client_ServerExceptionOccurred); // client.ServerConnected += // new EventHandler(client_ServerConnected); // client.ServerDisconnected += // new EventHandler(client_ServerDisconnected); // client.PlaintextReceived += // new EventHandler>(client_PlaintextReceived); // client.Connect(); // Console.WriteLine("TCP client has connected to server."); // Console.WriteLine("Type something to send to server..."); // while (true) // { // try // { // string text = Console.ReadLine(); // client.Send(text); // } // catch (Exception ex) // { // Console.WriteLine(ex.Message); // } // } // } // static void client_ServerExceptionOccurred( // object sender, TcpServerExceptionOccurredEventArgs e) // { // Logger.Debug(string.Format(CultureInfo.InvariantCulture, // "TCP server {0} exception occurred, {1}.", // e.ToString(), e.Exception.Message)); // } // static void client_ServerConnected( // object sender, TcpServerConnectedEventArgs e) // { // Logger.Debug(string.Format(CultureInfo.InvariantCulture, // "TCP server {0} has connected.", e.ToString())); // } // static void client_ServerDisconnected( // object sender, TcpServerDisconnectedEventArgs e) // { // Logger.Debug(string.Format(CultureInfo.InvariantCulture, // "TCP server {0} has disconnected.", e.ToString())); // } // static void client_PlaintextReceived( // object sender, TcpDatagramReceivedEventArgs e) // { // Console.Write(string.Format("Server : {0} --> ", // e.TcpClient.Client.RemoteEndPoint.ToString())); // Console.WriteLine(string.Format("{0}", e.Datagram)); // } // } //补充代码 //复制代码 //代码如下: ///// // /// Internal class to join the TCP client and buffer together // /// for easy management in the server // /// // internal class TcpClientState // { // /// // /// Constructor for a new Client // /// // /// The TCP client // /// The byte array buffer // public TcpClientState(TcpClient tcpClient, byte[] buffer) // { // if (tcpClient == null) // throw new ArgumentNullException("tcpClient"); // if (buffer == null) // throw new ArgumentNullException("buffer"); // this.TcpClient = tcpClient; // this.Buffer = buffer; // } // /// // /// Gets the TCP Client // /// // public TcpClient TcpClient { get; private set; } // /// // /// Gets the Buffer. // /// // public byte[] Buffer { get; private set; } // /// // /// Gets the network stream // /// // public NetworkStream NetworkStream // { // get { return TcpClient.GetStream(); } // } // } //复制代码 //代码如下: ///// // /// 与客户端的连接已建立事件参数 // /// // public class TcpClientConnectedEventArgs : EventArgs // { // /// // /// 与客户端的连接已建立事件参数 // /// // /// 客户端 // public TcpClientConnectedEventArgs(TcpClient tcpClient) // { // if (tcpClient == null) // throw new ArgumentNullException("tcpClient"); // this.TcpClient = tcpClient; // } // /// // /// 客户端 // /// // public TcpClient TcpClient { get; private set; } // } //复制代码 //代码如下: ///// // /// 与客户端的连接已断开事件参数 // /// // public class TcpClientDisconnectedEventArgs : EventArgs // { // /// // /// 与客户端的连接已断开事件参数 // /// // /// 客户端 // public TcpClientDisconnectedEventArgs(TcpClient tcpClient) // { // if (tcpClient == null) // throw new ArgumentNullException("tcpClient"); // this.TcpClient = tcpClient; // } // /// // /// 客户端 // /// // public TcpClient TcpClient { get; private set; } // } //复制代码 //代码如下: ///// // /// 与服务器的连接发生异常事件参数 // /// // public class TcpServerExceptionOccurredEventArgs : EventArgs // { // /// // /// 与服务器的连接发生异常事件参数 // /// // /// 服务器IP地址列表 // /// 服务器端口 // /// 内部异常 // public TcpServerExceptionOccurredEventArgs( // IPAddress[] ipAddresses, int port, Exception innerException) // { // if (ipAddresses == null) // throw new ArgumentNullException("ipAddresses"); // this.Addresses = ipAddresses; // this.Port = port; // this.Exception = innerException; // } // /// // /// 服务器IP地址列表 // /// // public IPAddress[] Addresses { get; private set; } // /// // /// 服务器端口 // /// // public int Port { get; private set; } // /// // /// 内部异常 // /// // public Exception Exception { get; private set; } // /// // /// Returns a that represents this instance. // /// // /// // /// A that represents this instance. // /// // public override string ToString() // { // string s = string.Empty; // foreach (var item in Addresses) // { // s = s + item.ToString() + ','; // } // s = s.TrimEnd(','); // s = s + ":" + Port.ToString(CultureInfo.InvariantCulture); // return s; // } // } #endregion } }