110,538
社区成员
发帖
与我相关
我的任务
分享
/// 启动服务的方法
/// </summary>
public void strartServer() {
_packageCount = Convert.ToInt64(FileRead.packagePath().Trim());
_sessionTable = new Hashtable();
IPAddress local = IPAddress.Parse(FileRead.ServerPath().Split('@')[0].Split(':')[1].Trim());
IPEndPoint iep = new IPEndPoint(local, Convert.ToInt32(ynSER.FileRead.ServerPath().Split('@')[1].Split(':')[1].Trim()));
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(iep);
server.Listen(2000);
server.BeginAccept(new AsyncCallback(Accept), server);
}
/// <summary>
/// 异步调用 回调函数
/// </summary>
/// <param name="iar"></param>
public void Accept(IAsyncResult iar)
{
Socket oldserver = null;
//传入的socket
oldserver = (Socket)iar.AsyncState;
//在原始套接字上调用EndAccept方法,返回新的套接字
//Socket recSocket = oldserver.EndAccept(iar);
Socket recSocket = null;
try {
recSocket = oldserver.EndAccept(iar);
}catch(Exception eee){
return;
}
try
{
if (_sessionTable.Count>2000)
{
//_sessionTable.Add(_sessionTable.Count, recSocket);
//超过最大连接数 告诉客户端服务器已满
byte[] isFull = Encoding.UTF8.GetBytes("0");
recSocket.Send(isFull);
LogClass.WriteLog("Error", "socket:" + recSocket.RemoteEndPoint, "满了!!!!" + recSocket.RemoteEndPoint.ToString().Split(':')[1].ToString());
clineSocketClass csc = new clineSocketClass();
csc.socke = recSocket;
csc.byt = new byte[_packageCount];
csc.pf = new NewPackageFile();
csc._BYTE_REC = new Hashtable();
csc.OK_STR_HS = new Hashtable();
csc.socke.BeginReceive(csc.byt, 0, csc.byt.Length, SocketFlags.None, new AsyncCallback(read_Callback), csc);
server.BeginAccept(new AsyncCallback(Accept), server);
}else{
byte[] isFull = Encoding.UTF8.GetBytes("1");
recSocket.Send(isFull);
lock (_sessionTable)
{
_sessionTable.Add(recSocket.Handle, recSocket);
}
if (event_Conn != null)
{
clineSocketEnentArgs socketConn = new clineSocketEnentArgs();
socketConn.Clin_message = "连接:[" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss").ToString() + "]" + recSocket.RemoteEndPoint.ToString();
event_Conn(this, socketConn);
}
//多线程传递当前并发数量
if (event_ConnectionCount!=null)
{
NowConnectionCountEnentArgs NowConnectionCount = new NowConnectionCountEnentArgs();
NowConnectionCount.NowConnectionCount1_message = _sessionTable.Count.ToString();
event_ConnectionCount(this, NowConnectionCount);
}
clineSocketClass csc = new clineSocketClass();
csc.socke = recSocket;
csc.byt = new byte[_packageCount];
csc.pf = new NewPackageFile();
csc._BYTE_REC = new Hashtable();
csc.OK_STR_HS = new Hashtable();
csc.socke.BeginReceive(csc.byt, 0, csc.byt.Length, SocketFlags.None, new AsyncCallback(read_Callback), csc);
server.BeginAccept(new AsyncCallback(Accept), server);
}
}
catch (SocketException e)
{
if (event_excmessage != null)
{
ECXEEventArgs eea = new ECXEEventArgs();
eea.EXC_message1 = string.Format("【异常】[" + recSocket.RemoteEndPoint.ToString() + "]:" + e.ToString());
event_excmessage(this, eea);
}
oldserver.Close();
}
}
/// <summary>
/// 接收数据的回调函数
/// </summary>
/// <param name="iar"></param>
public void read_Callback(IAsyncResult iar)
{
clineSocketClass csc = (clineSocketClass)iar.AsyncState;
// LogClass.WriteLog("Error", "huidiao:", "huidiao");
try
{
int recv = csc.socke.EndReceive(iar);
csc.HDcount++;
csc.cut_pg_count = this._packageCount;
if (recv!=0) {
//处理多余的字节数组问题
byte[] Middle_Byte = new byte[recv];
/**
* 当接受的数据小于socket缓
* 存的时候将多余的空位删除掉,
* 否则在数据包的解析过程中
* 会出现各种问题
*/
//Array.Copy(源数据, 源数据开始复制处索引, 接收数据, 接收数据开始处索引, 复制多少个数据);
Array.Copy(csc.byt, 0, Middle_Byte, 0, recv);
// string isgo = "yes";
if (csc.pf.teturn_byte_message == null)
{
csc.pf.GetActualString("", Middle_Byte);
csc.ServerName = csc.pf.SN;
if (csc.pf.teturn_byte_message!=null)
{
if (csc.pf.ZC == csc.pf.teturn_byte_message.Length)
{
// LogClass.WriteLog("Error", "数据包解析完毕", "数据包解析完毕");
GetDBMessageClass GetDBM = new GetDBMessageClass(csc);
// LogClass.WriteLog("Error", "【" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss:ffff").ToString() + "】", "插入异常" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss").ToString().Replace('-', ' ').Replace(':', ' '));
csc.pf = new NewPackageFile();
lock (_sessionTable)
{
_sessionTable.Remove(csc.socke.Handle);
_CLZSCount++;
}
//多线程传递当前并发数量
if (event_ConnectionCount != null)
{
NowConnectionCountEnentArgs NowConnectionCount = new NowConnectionCountEnentArgs();
NowConnectionCount.NowConnectionCount1_message = _sessionTable.Count.ToString();
event_ConnectionCount(this, NowConnectionCount);
}
}
}
}
else {
if (csc.pf.ZC != csc.pf.teturn_byte_message.Length)
{
csc.pf.GetActualString("", Middle_Byte);
// LogClass.WriteLog("Error", "数据包解析", "数据包解析");
if (csc.pf.ZC == csc.pf.teturn_byte_message.Length)
{
//LogClass.WriteLog("Error", "数据包解析完毕", "数据包解析完毕" + csc.socke.Handle);
GetDBMessageClass GetDBM = new GetDBMessageClass(csc);
// LogClass.WriteLog("Error", "【" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss:ffff").ToString() + "】", "插入异常" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss:ffff").ToString().Replace('-', ' ').Replace(':', ' '));
csc.pf = new NewPackageFile();
_sessionTable.Remove(csc.socke.Handle);
lock (_sessionTable)
{
_sessionTable.Remove(csc.socke.Handle);
_CLZSCount++;
}
//多线程传递当前并发数量
if (event_ConnectionCount != null)
{
NowConnectionCountEnentArgs NowConnectionCount = new NowConnectionCountEnentArgs();
NowConnectionCount.NowConnectionCount1_message = _sessionTable.Count.ToString();
event_ConnectionCount(this, NowConnectionCount);
}
}
}
}
//清空系统缓存
csc.byt = new byte[_packageCount];
//执行回调函数的时候已经进行了数据的接收
csc.socke.BeginReceive(csc.byt, 0, csc.byt.Length, SocketFlags.None, new AsyncCallback(read_Callback), csc);
}
}
catch (SocketException e)
{
if (event_excmessage != null)
{
ECXEEventArgs eea = new ECXEEventArgs();
eea.EXC_message1 = string.Format("【--异常--】[" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss:ffff").ToString() + "]:" + e.ToString());
event_excmessage(this, eea);
}
}
}