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