using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Xml;
namespace COMM
{
public class ThreadWithPara
{
private event Global.EvtSocketClientReceiveMsg onMyDelegate; //指向事件处理代码的指针
private string myrevString;
public ThreadWithPara(string str, Global.EvtSocketClientReceiveMsg MyDelegate)
{
myrevString = str;
onMyDelegate = MyDelegate;
}
public void ThreadProc()
{
if (onMyDelegate != null)
{
onMyDelegate(myrevString); //----------------------------------------------------------------事件
}
}
}
//--------------------------------------------------
public class SocketClient
{
log4net.ILog Log = log4net.LogManager.GetLogger("SocketLog"); ///SocketClient通信收发包的操作类 保存到文本文件
private bool appClose = false;
public bool AppClose
{
get { return appClose; }
set { appClose = value; }
}
private System.Timers.Timer myTime;
public event Global.EvtSocketClientReceiveMsg onMyDelegate; //指向事件处理代码的指针
private Thread thread;//接收数据的线程
private const int DataBufferSize = 1024 * 50; // Size of receive buffer.
private int DataBufferSizeLast = 0; //最后一留下来的数据总长度
private const int DataHeadLen = 5; //包头长度
private const int APIVersion = 1; //版本号
private byte[] DataBuffer = new byte[DataBufferSize]; // Receive buffer.
private byte[] DataBufferLast;//= new byte[DataBufferSize]; // Receive buffer.
private Socket Clientsock;
private int iport = 8888;
private string sIP = "172.0.0.1";
public bool ConnectFlag = true;
public int ConnectCount = 0;
//------------------------------
public SocketClient()
{
myTime = new System.Timers.Timer();
myTime.Interval = 5000;
myTime.Elapsed += new System.Timers.ElapsedEventHandler(this.Check_State);
myTime.Enabled = true;
}
public SocketClient(string IP, int port, int interval)
{
myTime = new System.Timers.Timer();
myTime.Interval = interval;
myTime.Elapsed += new System.Timers.ElapsedEventHandler(this.Check_State);
myTime.Enabled = true;
iport = port;
sIP = IP;
}
public void Connect(string IP, int port)
{
try
{
iport = port;
sIP = IP;
IPAddress myIPAddress = IPAddress.Parse(sIP);
IPEndPoint myIPEndPoint = new IPEndPoint(myIPAddress, iport);//把ip和端口转化为IPEndPoint实例
Clientsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
Clientsock.Connect(myIPEndPoint);//连接到服务器
thread = new Thread(new ThreadStart(receiveThread));
thread.Start();
ConnectFlag = true;
ConnectCount = 0;
}
catch (SocketException ex)
{
Log.Info("Connect:" + ex.Message + "ErrorCode:" + ex.ErrorCode.ToString());
}
catch (Exception ex)
{
Log.Info("Connect:" + ex.Message);
try
{
ConnectFlag = false;
if (Clientsock.Connected == true)
{
Clientsock.Shutdown(SocketShutdown.Both);
Clientsock.Close();
}
}
finally { throw ex; }
}
}
public void Connect()
{
try
{
IPAddress myIPAddress = IPAddress.Parse(sIP);
IPEndPoint myIPEndPoint = new IPEndPoint(myIPAddress, iport);//把ip和端口转化为IPEndPoint实例
Clientsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
Clientsock.Connect(myIPEndPoint);//连接到服务器
thread = new Thread(new ThreadStart(receiveThread));
thread.Start();
ConnectFlag = true;
if (ConnectCount >= 1)
{
string aa = "<pack><head><ver>2000</ver><oper>8888</oper><gid>76C4B8A42C824EB7B7897B70AF50E6B3</gid><stream>00000000</stream><from>8888</from><to>8888</to></head></pack>";
onMyDelegate(aa);
}
ConnectCount = 0;
}
catch (SocketException ex)
{
Log.Info("Connect:" + ex.Message + "ErrorCode:" + ex.ErrorCode.ToString());
}
catch (Exception ex)
{
Log.Info("Connect:" + ex.Message);
try
{
ConnectFlag = false;
if (Clientsock.Connected == true)
{
Clientsock.Shutdown(SocketShutdown.Both);
Clientsock.Close();
}
}
finally { throw ex; }
}
}
private void receiveThread()
{
try
{
while (true)
{
byte[] DataBuffer = new byte[DataBufferSize - DataBufferSizeLast];
int receivedBytesCount = Clientsock.Receive(DataBuffer, DataBufferSize - DataBufferSizeLast, SocketFlags.None);
if (receivedBytesCount == 0) //如果收到的是0的字节 ,说明网络有问题 (断开)
{
Log.Info("receivedBytesCount=0 收到网络服务被关闭:");
this.Shutdown();
return;
}
int iTempDataBufferSizeLast = 0;
byte[] TempBytes = new byte[receivedBytesCount + DataBufferSizeLast]; //receivedBytesCount + DataBufferSizeLast
if (DataBufferLast != null)
{
Buffer.BlockCopy(DataBufferLast, 0, TempBytes, 0, DataBufferSizeLast);
iTempDataBufferSizeLast = DataBufferSizeLast;
DataBufferLast = null; //---- 使用完后 为空值
DataBufferSizeLast = 0;
}
Buffer.BlockCopy(DataBuffer, 0, TempBytes, iTempDataBufferSizeLast, receivedBytesCount);
EncodingBytes(TempBytes, receivedBytesCount + iTempDataBufferSizeLast);
}
}
catch (SocketException ex)
{
Log.Info("receiveThread:" + ex.Message + "ErrorCode:" + ex.ErrorCode.ToString());
this.Shutdown();
}
catch (Exception ex)
{
Log.Info("receiveThread:" + ex.Message);
this.Shutdown();
}
}
private void EncodingBytes(byte[] Totalbytes, int TotalBytesCount)
{
// Thread.Sleep(10000);
try
{
if (Totalbytes.Length <= 5)
{
DataBufferLast = new byte[TotalBytesCount];
Buffer.BlockCopy(Totalbytes, 0, DataBufferLast, 0, TotalBytesCount);
return;
}
byte[] TempHeadBytes = new byte[4];
Buffer.BlockCopy(Totalbytes, 1, TempHeadBytes, 0, 4);
int TempPackLen = BitConverter.ToInt32(TempHeadBytes, 0); //每个包的长度
if ((TempPackLen + DataHeadLen) > TotalBytesCount)
{
DataBufferSizeLast = TotalBytesCount;
DataBufferLast = new byte[TotalBytesCount];
Buffer.BlockCopy(Totalbytes, 0, DataBufferLast, 0, TotalBytesCount);
return;
}
byte[] TempPackBytes = new byte[TempPackLen];
for (int i = 0; i < TempPackLen; i++)
{
TempPackBytes[i] = Totalbytes[i + DataHeadLen];
}
//string receivedStr = System.Text.Encoding.Default.GetString(TempPackBytes);
if (onMyDelegate != null)
{
--
//ThreadWithPara para = new ThreadWithPara(System.Text.Encoding.Default.GetString(TempPackBytes), onMyDelegate);
//Thread t = new Thread(new ThreadStart(para.ThreadProc));
//t.Start();
//t.IsBackground = true;
--
onMyDelegate(System.Text.Encoding.Default.GetString(TempPackBytes)); //----------------------------------------------------------------事件
}
else
{
Log.Info("onMyDelegate事件为空!");
}
if (TotalBytesCount > DataHeadLen + TempPackLen)
{
byte[] Bytes = new byte[TotalBytesCount - DataHeadLen - TempPackLen];
Buffer.BlockCopy(Totalbytes, DataHeadLen + TempPackLen, Bytes, 0, TotalBytesCount - DataHeadLen - TempPackLen);
this.EncodingBytes(Bytes, TotalBytesCount - DataHeadLen - TempPackLen);
}
}
catch (SocketException ex)
{
Log.Info("EncodingBytes:" + ex.Message + "ErrorCode:" + ex.ErrorCode.ToString());
}
catch (Exception ex)
{
Log.Info("EncodingBytes:" + ex.Message);
}
}
public void CloseSocket()
{
try
{
if (thread != null)
{
thread.Abort();
thread = null;
}
if (Clientsock.Connected == true)
{
Clientsock.Shutdown(SocketShutdown.Both);
Clientsock.Close();
}
}
catch (SocketException ex)
{
Log.Info("CloseSocket:" + ex.Message + "ErrorCode:" + ex.ErrorCode.ToString());
}
catch (Exception ex)
{
Log.Info("CloseSocket:" + ex.Message);
throw ex;
}
}
//public bool SendPack(string Msg)
//{
// try
// {
// if (Clientsock.Connected == true)
// {
// byte[] javaPackageBytes = GetSendPack(Msg);
// int i = Clientsock.Send(javaPackageBytes, javaPackageBytes.Length, 0);
// ConnectFlag = true;
// return true;
// }
// return false;
// }
// catch
// {
// this.Shutdown();
// return false;
// }
//}
public void SendPack(string Msg, ref bool SendFlag)
{
try
{
SendFlag = false; ConnectFlag = false;
byte[] javaPackageBytes = GetSendPack(Msg);
int i = Clientsock.Send(javaPackageBytes, javaPackageBytes.Length, 0);
if ((Clientsock.Connected == true) && (i == javaPackageBytes.Length))
{
ConnectFlag = true;
SendFlag = true;
}
}
catch (SocketException ex)
{
SendFlag = false; ConnectFlag = false;
Log.Info("SendPack:" + ex.Message + "ErrorCode:" + ex.ErrorCode.ToString());
this.Shutdown();
}
catch (Exception ex)
{
SendFlag = false; ConnectFlag = false;
Log.Info("SendPack:" + ex.Message);
this.Shutdown();
throw ex;
}
}
private void Shutdown()
{
try
{
ConnectFlag = false;
if (Clientsock.Connected == true)
{
Clientsock.Shutdown(SocketShutdown.Both);
Clientsock.Close();
}
if (thread != null)
{
thread.Abort();
thread = null;
}
}
catch (SocketException ex)
{
Log.Info("Shutdown:" + ex.Message + ex.ErrorCode.ToString());
}
catch (ThreadAbortException ex)
{
Log.Info("Shutdown:" + ex.Message);
thread = null;
}
catch (ThreadStateException ex)
{
Log.Info("Shutdown:" + ex.Message);
}
catch (Exception ex)
{
Log.Info("Shutdown:" + ex.Message);
}
finally
{
ConnectFlag = false;
if (Clientsock.Connected == true)
{
Clientsock.Shutdown(SocketShutdown.Both);
Clientsock.Close();
}
}
}
private byte[] GetSendPack(string SendMsg)
{
byte[] BytesVer = Encoding.Default.GetBytes(APIVersion.ToString()); //版本长度
byte[] Bytes = Encoding.Default.GetBytes(SendMsg); //发送内容总长度
byte[] javaPackageBytes = new Byte[Bytes.Length + DataHeadLen]; // 包总长度
byte[] b4 = Java_Int32ToBytes((UInt32)(Bytes.Length));
BytesVer.CopyTo(javaPackageBytes, 0);
b4.CopyTo(javaPackageBytes, 1);
Bytes.CopyTo(javaPackageBytes, DataHeadLen);
return javaPackageBytes;
}
// 4字节整型 --> 字节数组(Java队列用的序,低位在前,高位在后)
private byte[] Java_Int32ToBytes(UInt32 i)
{
byte[] bytes = new byte[4];
bytes[0] = (byte)(i % 256);
bytes[1] = (byte)(i / 256);
bytes[2] = (byte)(i / (65536));
bytes[3] = (byte)(i / (16777216));
return bytes;
}
private void Check_State(object sender, System.Timers.ElapsedEventArgs e) //程序自动重联处理
{
try
{
if ((ConnectFlag == false) && (Clientsock.Connected == false))
{
ConnectCount += 1;
this.Connect();
}
}
catch (SocketException ex)
{
Log.Info("Check_State:" + ex.Message + "ErrorCode:" + ex.ErrorCode.ToString());
}
catch (Exception ex) //
{
Log.Info("Check_State:" + ex.Message);
}
}
}
}
/* public class SocketClient
{
log4net.ILog Log = log4net.LogManager.GetLogger("SocketLog"); ///SocketClient通信收发包的操作类 保存到文本文件
private bool appClose = false;
public bool AppClose
{
get { return appClose; }
set { appClose = value; }
}
private System.Timers.Timer myTime;
public event Global.EvtSocketClientReceiveMsg onMyDelegate; //指向事件处理代码的指针
private Thread thread;//接收数据的线程
private const int DataBufferSize = 1024 * 50; // Size of receive buffer.
private int DataBufferSizeLast = 0; //最后一留下来的数据总长度
private const int DataHeadLen = 5; //包头长度
private const int APIVersion = 1; //版本号
private byte[] DataBuffer = new byte[DataBufferSize]; // Receive buffer.
private byte[] DataBufferLast;//= new byte[DataBufferSize]; // Receive buffer.
private Socket Clientsock;
private int iport = 8888;
private string sIP = "172.0.0.1";
public bool ConnectFlag = true;
public int ConnectCount = 0;
//------------------------------
public SocketClient()
{
myTime = new System.Timers.Timer();
myTime.Interval = 5000;
myTime.Elapsed += new System.Timers.ElapsedEventHandler(this.Check_State);
myTime.Enabled = true;
}
public SocketClient(string IP, int port, int interval)
{
myTime = new System.Timers.Timer();
myTime.Interval = interval;
myTime.Elapsed += new System.Timers.ElapsedEventHandler(this.Check_State);
myTime.Enabled = true;
iport = port;
sIP = IP;
}
public void Connect(string IP, int port)
{
try
{
iport = port;
sIP = IP;
IPAddress myIPAddress = IPAddress.Parse(sIP);
IPEndPoint myIPEndPoint = new IPEndPoint(myIPAddress, iport);//把ip和端口转化为IPEndPoint实例
Clientsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
Clientsock.Connect(myIPEndPoint);//连接到服务器
thread = new Thread(new ThreadStart(receiveThread));
thread.Start();
ConnectFlag = true;
ConnectCount = 0;
}
catch (SocketException ex)
{
Log.Info("Connect:" + ex.Message + "ErrorCode:" + ex.ErrorCode.ToString());
}
catch (Exception ex)
{
Log.Info("Connect:" + ex.Message);
try
{
ConnectFlag = false;
if (Clientsock.Connected == true)
{
Clientsock.Shutdown(SocketShutdown.Both);
Clientsock.Close();
}
}
finally { throw ex; }
}
}
public void Connect()
{
try
{
IPAddress myIPAddress = IPAddress.Parse(sIP);
IPEndPoint myIPEndPoint = new IPEndPoint(myIPAddress, iport);//把ip和端口转化为IPEndPoint实例
Clientsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
Clientsock.Connect(myIPEndPoint);//连接到服务器
thread = new Thread(new ThreadStart(receiveThread));
thread.Start();
ConnectFlag = true;
if (ConnectCount >= 1)
{
string aa = "<pack><head><ver>2000</ver><oper>8888</oper><gid>76C4B8A42C824EB7B7897B70AF50E6B3</gid><stream>00000000</stream><from>8888</from><to>8888</to></head></pack>";
onMyDelegate(aa);
}
ConnectCount = 0;
}
catch (SocketException ex)
{
Log.Info("Connect:" + ex.Message + "ErrorCode:" + ex.ErrorCode.ToString());
}
catch (Exception ex)
{
Log.Info("Connect:" + ex.Message);
try
{
ConnectFlag = false;
if (Clientsock.Connected == true)
{
Clientsock.Shutdown(SocketShutdown.Both);
Clientsock.Close();
}
}
finally { throw ex; }
}
}
private void receiveThread()
{
try
{
while (true)
{
byte[] DataBuffer = new byte[DataBufferSize - DataBufferSizeLast];
int receivedBytesCount = Clientsock.Receive(DataBuffer, DataBufferSize - DataBufferSizeLast, SocketFlags.None);
if (receivedBytesCount == 0) //如果收到的是0的字节 ,说明网络有问题 (断开)
{
Log.Info("receivedBytesCount=0 收到网络服务被关闭:");
this.Shutdown();
return;
}
int iTempDataBufferSizeLast = 0;
byte[] TempBytes = new byte[receivedBytesCount + DataBufferSizeLast]; //receivedBytesCount + DataBufferSizeLast
if (DataBufferLast != null)
{
Buffer.BlockCopy(DataBufferLast, 0, TempBytes, 0, DataBufferSizeLast);
iTempDataBufferSizeLast = DataBufferSizeLast;
DataBufferLast = null; //---- 使用完后 为空值
DataBufferSizeLast = 0;
}
Buffer.BlockCopy(DataBuffer, 0, TempBytes, iTempDataBufferSizeLast, receivedBytesCount);
EncodingBytes(TempBytes, receivedBytesCount + iTempDataBufferSizeLast);
}
}
catch (SocketException ex)
{
Log.Info("receiveThread:" + ex.Message + "ErrorCode:" + ex.ErrorCode.ToString());
this.Shutdown();
}
catch (Exception ex)
{
Log.Info("receiveThread:" + ex.Message);
this.Shutdown();
}
}
private void EncodingBytes(byte[] Totalbytes, int TotalBytesCount)
{
try
{
if (Totalbytes.Length <= 5)
{
DataBufferLast = new byte[TotalBytesCount];
Buffer.BlockCopy(Totalbytes, 0, DataBufferLast, 0, TotalBytesCount);
return;
}
byte[] TempHeadBytes = new byte[4];
Buffer.BlockCopy(Totalbytes, 1, TempHeadBytes, 0, 4);
int TempPackLen = BitConverter.ToInt32(TempHeadBytes, 0); //每个包的长度
if ((TempPackLen + DataHeadLen) > TotalBytesCount)
{
DataBufferSizeLast = TotalBytesCount;
DataBufferLast = new byte[TotalBytesCount];
Buffer.BlockCopy(Totalbytes, 0, DataBufferLast, 0, TotalBytesCount);
return;
}
byte[] TempPackBytes = new byte[TempPackLen];
for (int i = 0; i < TempPackLen; i++)
{
TempPackBytes[i] = Totalbytes[i + DataHeadLen];
}
string receivedStr = System.Text.Encoding.Default.GetString(TempPackBytes);
if (onMyDelegate != null)
{
onMyDelegate(receivedStr); //----------------------------------------------------------------事件
}
if (TotalBytesCount > DataHeadLen + TempPackLen)
{
byte[] Bytes = new byte[TotalBytesCount - DataHeadLen - TempPackLen];
Buffer.BlockCopy(Totalbytes, DataHeadLen + TempPackLen, Bytes, 0, TotalBytesCount - DataHeadLen - TempPackLen);
this.EncodingBytes(Bytes, TotalBytesCount - DataHeadLen - TempPackLen);
}
}
catch (SocketException ex)
{
Log.Info("EncodingBytes:" + ex.Message + "ErrorCode:" + ex.ErrorCode.ToString());
}
catch (Exception ex)
{
Log.Info("EncodingBytes:" + ex.Message);
}
}
public void CloseSocket()
{
try
{
if (thread != null)
{
thread.Abort();
thread = null;
}
if (Clientsock.Connected == true)
{
Clientsock.Shutdown(SocketShutdown.Both);
Clientsock.Close();
}
}
catch (SocketException ex)
{
Log.Info("CloseSocket:" + ex.Message + "ErrorCode:" + ex.ErrorCode.ToString());
}
catch (Exception ex)
{
Log.Info("CloseSocket:" + ex.Message);
throw ex;
}
}
//public bool SendPack(string Msg)
//{
// try
// {
// if (Clientsock.Connected == true)
// {
// byte[] javaPackageBytes = GetSendPack(Msg);
// int i = Clientsock.Send(javaPackageBytes, javaPackageBytes.Length, 0);
// ConnectFlag = true;
// return true;
// }
// return false;
// }
// catch
// {
// this.Shutdown();
// return false;
// }
//}
public void SendPack(string Msg, ref bool SendFlag)
{
try
{
SendFlag = false; ConnectFlag = false;
byte[] javaPackageBytes = GetSendPack(Msg);
int i = Clientsock.Send(javaPackageBytes, javaPackageBytes.Length, 0);
if ((Clientsock.Connected == true) && (i == javaPackageBytes.Length))
{
ConnectFlag = true;
SendFlag = true;
}
}
catch (SocketException ex)
{
SendFlag = false; ConnectFlag = false;
Log.Info("SendPack:" + ex.Message + "ErrorCode:" + ex.ErrorCode.ToString());
this.Shutdown();
}
catch (Exception ex)
{
SendFlag = false; ConnectFlag = false;
Log.Info("SendPack:" + ex.Message);
this.Shutdown();
throw ex;
}
}
private void Shutdown()
{
try
{
ConnectFlag = false;
if (Clientsock.Connected == true)
{
Clientsock.Shutdown(SocketShutdown.Both);
Clientsock.Close();
}
if (thread != null)
{
thread.Abort();
thread = null;
}
}
catch (SocketException ex)
{
Log.Info("Shutdown:" + ex.Message + ex.ErrorCode.ToString());
}
catch (ThreadAbortException ex)
{
Log.Info("Shutdown:" + ex.Message);
thread = null;
}
catch (ThreadStateException ex)
{
Log.Info("Shutdown:" + ex.Message);
}
catch (Exception ex)
{
Log.Info("Shutdown:" + ex.Message);
}
finally
{
ConnectFlag = false;
if (Clientsock.Connected == true)
{
Clientsock.Shutdown(SocketShutdown.Both);
Clientsock.Close();
}
}
}
private byte[] GetSendPack(string SendMsg)
{
byte[] BytesVer = Encoding.Default.GetBytes(APIVersion.ToString()); //版本长度
byte[] Bytes = Encoding.Default.GetBytes(SendMsg); //发送内容总长度
byte[] javaPackageBytes = new Byte[Bytes.Length + DataHeadLen]; // 包总长度
byte[] b4 = Java_Int32ToBytes((UInt32)(Bytes.Length));
BytesVer.CopyTo(javaPackageBytes, 0);
b4.CopyTo(javaPackageBytes, 1);
Bytes.CopyTo(javaPackageBytes, DataHeadLen);
return javaPackageBytes;
}
// 4字节整型 --> 字节数组(Java队列用的序,低位在前,高位在后)
private byte[] Java_Int32ToBytes(UInt32 i)
{
byte[] bytes = new byte[4];
bytes[0] = (byte)(i % 256);
bytes[1] = (byte)(i / 256);
bytes[2] = (byte)(i / (65536));
bytes[3] = (byte)(i / (16777216));
return bytes;
}
private void Check_State(object sender, System.Timers.ElapsedEventArgs e) //程序自动重联处理
{
try
{
if ((ConnectFlag == false) && (Clientsock.Connected == false))
{
ConnectCount += 1;
this.Connect();
}
}
catch (SocketException ex)
{
Log.Info("Check_State:" + ex.Message + "ErrorCode:" + ex.ErrorCode.ToString());
}
catch (Exception ex) //
{
Log.Info("Check_State:" + ex.Message);
}
}
//---------------------------------------------------------------------------------------------------------------
}*/