Server

2020-05-08  本文已影响0人  高呼吾名
using System;
using System.Net;
using System.Net.Sockets;
using System.Collections.Generic;
using System.Diagnostics;
public class Server {
    private Socket serverSocket;
    //private Semaphore acceptSemaphore;
    private ClientPeerPool clientPeerPool;


    private IApplication application;
    public void SetApplication(IApplication app) {
        application = app;
    }


    public void Start(int port, int maxCount) {

        serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        //acceptSemaphore = new Semaphore(maxCount, maxCount);

        clientPeerPool = new ClientPeerPool(maxCount);
        ClientPeer tmpClientPeer = null;
        for (int i = 0; i < maxCount; i++) {
            tmpClientPeer = new ClientPeer();
            tmpClientPeer.ReceiveArgs.Completed += receive_Complete;
            tmpClientPeer.receiveCompleted = receiveCompleted;
            tmpClientPeer.sendDisconnect = Disconnect;
            clientPeerPool.Enqueue(tmpClientPeer);
        }



        serverSocket.Bind(new IPEndPoint(IPAddress.Any, port));

        serverSocket.Listen(maxCount);

        Console.WriteLine(TimerManager.GetNowTime() + "服务器启动...监听的端口为" + port);

        startAccept(null);
    }

    public void Abort() {
        if (serverSocket == null) {
            return;
        }
        ClientCache.CloseAllClient();
        closed = true;
        serverSocket.Dispose();
        serverSocket.Close();
        Console.WriteLine("关闭服务器");
    }

    #region 连接
    //开始等待客户端连接
    private void startAccept(SocketAsyncEventArgs e) {
        if (e == null) {
            e = new SocketAsyncEventArgs();
            e.Completed += accept_Completed;
        }
        //判断异步事件是否执行完毕 true 表示正在执行,执行完触发completed事件 。false表示执行完成 未执行completed事件
        bool result = serverSocket.AcceptAsync(e);

        if (result == false) {
            processAccept(e);
        }

    }


    //接收连接请求异步事件成功时触发
    private void accept_Completed(object sender,SocketAsyncEventArgs e) {
        processAccept(e);
    }

    //处理连接请求
    private void processAccept(SocketAsyncEventArgs e) {
        //限制线程访问
        //acceptSemaphore.WaitOne();

        ClientPeer client = clientPeerPool.Dequeue();
        client.ClientSocket = e.AcceptSocket;

        Console.WriteLine(TimerManager.GetNowTime()+"客户端连接成功 :" + client.ClientSocket.RemoteEndPoint.ToString());

        ClientCache.AddClientCache(client);

        //startReceive(client);
        client.StartReceiveTask();

        e.AcceptSocket = null;
        startAccept(e);
    }

    #endregion

    byte[] buffer = new byte[102400];
    #region 接收数据
    public bool closed = false;
    //开始接收数据
    private void startReceive(ClientPeer client) {
        bool result = client.ClientSocket.ReceiveAsync(client.ReceiveArgs);
        if (result == false) {
            processReceive(client.ReceiveArgs);
        }
        client.ClientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallBack, client);
    }

    private void ReceiveCallBack(IAsyncResult ar) {
        string str = "";
    }



    //处理接收到的数据请求
    private void processReceive(SocketAsyncEventArgs e) {
        ClientPeer client = e.UserToken as ClientPeer;
        if (client.ReceiveArgs.SocketError == SocketError.Success && client.ReceiveArgs.BytesTransferred > 0) {
            byte[] packet = new byte[client.ReceiveArgs.BytesTransferred];
            Buffer.BlockCopy(client.ReceiveArgs.Buffer, 0, packet, 0, client.ReceiveArgs.BytesTransferred);
            //if(!closed)
            client.StartReceive(packet);
            startReceive(client);
        } else if(client.ReceiveArgs.BytesTransferred == 0) {
            if (client.ReceiveArgs.SocketError == SocketError.Success) {
                Disconnect(client, "客户端主动断开");
            }
        }
    }




    #endregion


    //client对象 接收消息完成时 触发的事件
    private void receive_Complete(object sender, SocketAsyncEventArgs e) {
        processReceive(e);
    }


    //client对象 将一条数据解析完成时的处理
    private void receiveCompleted(ClientPeer client, SocketMsg msg) {
        application.OnReceive(client, msg);
    }


    #region 断开连接



    //断开连接
    public void Disconnect(ClientPeer client,string reason) {
        SingleExecute.Instance.Execute(() => {
            if (client == null) {
                Console.WriteLine(TimerManager.GetNowTime() + client.ToString() + "当前指定的客户端连接对象为空,无法断开连接");
                return;
            }
            Console.WriteLine(TimerManager.GetNowTime() + client.ClientSocket.RemoteEndPoint.ToString() + "客户端断开连接 原因" + reason);
            if (reason == "客户端主动断开连接") {
                application.OnDisconnect(client, 0);
            } else {
                application.OnDisconnect(client, -1);
            }
            //移除client缓存
            ClientCache.RemoveClientCache(client);
            client.Disconnect();
            //回收对象方便下次使用
            clientPeerPool.Enqueue(client);
            //acceptSemaphore.Release();
        });

    }
    #endregion

}
上一篇下一篇

猜你喜欢

热点阅读