110,567
社区成员
发帖
与我相关
我的任务
分享
class test
{
public static ManualResetEvent ClientConn = new ManualResetEvent(false);
public static int Online = 0;
static void Main(string[] args)
{
IPAddress IP = Dns.GetHostAddresses(Dns.GetHostName())[0];
int Port = 21062;
TcpListener listener = new TcpListener(IP, Port);
Console.WriteLine("the server ip is {0},and port is {1}", IP, Port);
try
{
listener.Start();
while (true)
{
ClientConn.Reset();
listener.BeginAcceptSocket(AsyncAcceptSocketCallback, listener);
ClientConn.WaitOne();
}
}
catch (Exception)
{
Console.WriteLine("服务启动失败");
ClientConn.Set();
}
}
static void AsyncAcceptSocketCallback(IAsyncResult ar)
{
StateObject StateObject = new StateObject();
try
{
ClientConn.Set();
TcpListener listener = (TcpListener)ar.AsyncState;
Socket Socket = listener.EndAcceptSocket(ar);
IPEndPoint ip = (IPEndPoint)Socket.RemoteEndPoint;
string UserIP = ip.Address.ToString().TrimEnd() + ":" + ip.Port.ToString().TrimEnd();
StateObject.Socket = Socket;
StateObject.UserIP = UserIP;
Online = Online + 1;
Console.WriteLine("[连]来自{0}在{1}连接,当前在线人数:{2}", StateObject.UserIP, DateTime.Now.ToString("HH:mm:ms"), Online);
StateObject.Socket.BeginReceive(
StateObject.Buffer, 0, StateObject.BufferSize, SocketFlags.None, AsyncReceiveCallback, StateObject);
}
catch
{
Exception(StateObject);
}
}
static void AsyncReceiveCallback(IAsyncResult ar)
{
StateObject StateObject = ar.AsyncState as StateObject;
try
{
StateObject.ReceiveSize = StateObject.Socket.EndReceive(ar);
Console.WriteLine("[收]收到来自{0}发送的数据,时间{1},正在验证中...", StateObject.UserIP, DateTime.Now.ToString("HH:mm:ms"));
if (StateObject.ReceiveSize > 0)
{
ThreadPool.QueueUserWorkItem(UnPackAndSendBuffer, StateObject);
StateObject.Socket.BeginReceive(StateObject.Buffer, 0, StateObject.BufferSize, SocketFlags.None, AsyncReceiveCallback, StateObject);
}
else
{
Exception(StateObject);
}
}
catch //(SocketException se)
{
Exception(StateObject);
}
}
static void UnPackAndSendBuffer(object o)
{
Thread.CurrentThread.Priority = ThreadPriority.Highest;
byte[] Result = new byte[] { };
StateObject StateObject = o as StateObject;
UnPack UnPack = new UnPack();
try
{
//这里是解析数据包,并组合一个byte[],发送Result给客户端
Result = UnPack.UnPackAndGetData(StateObject.Buffer, StateObject.ReceiveSize, StateObject.UserIP);
if (Result.Length > 0)
{
StateObject.Socket.BeginSend(Result, 0, Result.Length, SocketFlags.None, AsyncSendCallback, StateObject);
Console.WriteLine("[发]已发送数据到{0},时间{1}\n", StateObject.UserIP, DateTime.Now.ToString("HH:mm:ms"));
}
else
{
Console.WriteLine("[错]解包失败01,来自{0},时间{1}\n", StateObject.UserIP, DateTime.Now.ToString("HH:mm:ms"));
Exception(StateObject);
}
}
catch //(Exception e)
{
Console.WriteLine("[错]解包失败,来自{0},时间{1}", StateObject.UserIP, DateTime.Now.ToString("HH:mm:ms"));
Exception(StateObject);
}
}
static void AsyncSendCallback(IAsyncResult ar)
{
StateObject StateObject = ar.AsyncState as StateObject;
try
{
StateObject.Socket.EndSend(ar);
}
catch //(SocketException se)
{
Exception(StateObject);
}
}
public class StateObject
{
public Socket Socket = null;
public const int BufferSize = 128;
public byte[] Buffer = new byte[BufferSize];
public int ReceiveSize = 0;
public string UserIP = string.Empty;
}
static void Exception(StateObject o)
{
if (o.Socket != null)
{
o.Socket.Close();
o.Socket = null;
Online = Online - 1;
}
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("[断]来自{0}已断开,时间{1},当前在线人数:{2}\n", o.UserIP, DateTime.Now.ToString("HH:mm:ms"), Online);
Console.ForegroundColor = ConsoleColor.Green;
}
}