/// <summary> /// 断开连接 /// </summary> /// <param name="client">表示断开的客户端连接对象</param> /// <param name="reason">断开的原因</param> public void Disconnect(ClientPeer client, string reason) { try { if (client == null) { throw new Exception("当前指定的客户端连接对象为空,无法断开连接"); } Console.WriteLine(client.ClientSocket.RemoteEndPoint.ToString() + "客户端断开连接 原因:" + reason); //通知应用层 这个客户的断开连接了 application.OnDisconnect(client); client.Disconnect(); //回收对象方便下次使用 clientPeerPool.Enqueue(client); acceptSemaphore.Release(); } catch (Exception e) { Console.WriteLine(e.Message); throw; } }
/// <summary> /// 用来开启服务器 /// </summary> /// <param name="port">端口号</param> ///<param name="maxCount">最大连接数量</param> public void Start(int port, int maxCount) { try { serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); acceptSemaphore = new Semaphore(maxCount, maxCount); //直接new出最大数量的连接对象 clientPeerPool = new ClientPeerPool(maxCount); ClientPeer tmpClientPeer = null; for (int i = 0; i < maxCount; i++) { tmpClientPeer = new ClientPeer(); tmpClientPeer.ReceiveArgs.Completed += receive_Completed; tmpClientPeer.receiveCompleted = receiveCompleted; tmpClientPeer.sendDisconnect = Disconnect; clientPeerPool.Enqueue(tmpClientPeer); } serverSocket.Bind(new IPEndPoint(IPAddress.Any, port)); serverSocket.Listen(10); Console.WriteLine("服务器启动..."); startAccept(null); } catch (Exception e) { Console.WriteLine(e.Message); throw; } }
private Semaphore acceptSemaphore; //位于system.Threanding 下。限制可同时访问某一资源池的线程数。 /// <summary> /// 开启服务器 1,bind 2,listen 3.accept /// </summary> /// <param name="port"></param> /// <param name="maxCount"></param> public void Start(int port, int maxCount) { try { serverPeer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); acceptSemaphore = new Semaphore(maxCount, maxCount); //在连接之前就调用客户端线程池 初始化 clientPeerPool = new ClientPeerPool(maxCount); ClientPeer clientPeer = null; for (int i = 0; i < maxCount; i++) { clientPeer = new ClientPeer(); clientPeer.receiveArgs.Completed += Receive_Complete; clientPeer.receiveCompleted = ReceiveCompleted; clientPeer.sendDisConnected = DisConnectd; clientPeerPool.Enqueue(clientPeer); } serverPeer.Bind(new IPEndPoint(IPAddress.Any, port)); serverPeer.Listen(10); Console.WriteLine("服务器启动成功..."); StartAccept(null); } catch (Exception e) { Console.WriteLine(e.Message); throw; } }
/// <summary> /// 断开连接 /// </summary> /// <param name="client">断开的连接对象</param> /// <param name="reason">断开的原因</param> public void DisConnectd(ClientPeer client, string reason) { try { //清空一些数据 if (client == null) { throw new Exception("当前客户端对象为空,无法断开"); } //通知应用层 这个客户断开连接 app.DisConnected(client); Console.WriteLine(client.clientSocket.RemoteEndPoint.ToString() + "已断开连接" + reason); client.Disconnected(); //回收对象 clientPeerPool.Enqueue(client); acceptSemaphore.Release(); } catch (Exception e) { Console.WriteLine(e.Message); throw; } }
/// <summary> /// 开启服务器 /// </summary> /// <param name="port">端口</param> /// <param name="maxCount">最大连接数量</param> public void Start(int port, int maxCount) { try { //修复bug ,设置最大的线程数, 参数:现在可用的线程数量, 最大可用的线程数量 acceptSemaphore = new Semaphore(maxCount, maxCount); //创建线程池 clientPool = new ClientPeerPool(maxCount); ClientPeer tempClient = null; for (int i = 0; i < maxCount; i++) { tempClient = new ClientPeer(); tempClient.ReceiveArgs.Completed += processReceiveCompeleted; //用委托来为client 提供函数 tempClient.receiveCompeleted += receiveCompleted; //发送的时候发生异常了,就直接断开连接,简单粗暴 tempClient.sendDisConnect += DisConnect; clientPool.Enqueue(tempClient); // } //任何人都可以接通的 serverSocket.Bind(new IPEndPoint(IPAddress.Any, port)); //把 10 个线程至于监听状态,不用每一次访问都得重新创建 serverSocket.Listen(10); //服务器启动 startAccept(null); } catch (Exception e) { //报错 Console.WriteLine(e.Message); throw; } }
/// <summary> /// 断开连接 /// </summary> /// <param name="client"></param> /// <param name="reason"></param> public void DisConnect(ClientPeer client, string reason) { try { //客户端断开的时候处理的数据, //1. 清空client 端的缓存 //2. 清空client 对象 if (client == null) { throw new Exception("当前的客户端为 null, 无法断开连接"); } Console.WriteLine("ahpilyServer ,disconnect 断开原因" + reason); //只有下一次连接的时候才会出现打印,这个是Unity 的Bug //TODO 通知应用层,断开连接 iApplication.onDisconnect(client); // // client.disConnect(); //回收 直接出来 clientPool.Enqueue(client); // 默然退出一个连接数量 acceptSemaphore.Release(); } catch (Exception e) { Console.WriteLine(e.Message); throw; } }
/// <summary> /// 开启服务器 /// </summary> /// <param name="port">端口号</param> /// <param name="maxCount">最大连接数量</param> public void Start(int port, int maxCount) { try { serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); acceptSemaphore = new Semaphore(maxCount, maxCount); clientPeerPool = new ClientPeerPool(maxCount); ClientPeer tempClientPeer = null; for (int i = 0; i < maxCount; i++) { tempClientPeer = new ClientPeer(); clientPeerPool.Enqueue(tempClientPeer); } serverSocket.Bind(new IPEndPoint(IPAddress.Any, port)); serverSocket.Listen(maxCount); Console.WriteLine("服务器启动"); startAccept(null); } catch (Exception e) { Console.WriteLine(e.Message); } }