晓月_【C#异步服务器】第一天 服务器源代码

来源:互联网 发布:unity3d vr 室内场景 编辑:程序博客网 时间:2024/04/30 18:36
首先,为了让框架更好的适应以后多个项目的开发。
我把网络框架写进了一个DLL里。
XiaoYue_Framework 

废话也不多说了。这是第一个版本。

暂时不考虑5000人在线。过2天再出5000人的代码。到时候我找服务器供大家测试。

因为自己是也第一次写。所以我的备注有点多。高手就少喷点了。

好落。要一起学习的加我的Q  1970007869   进群闲聊。  20%技术  80%的闲聊。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace XiaoYue_Framework
{

    //晓月服务器框架类。 先实现功能,再量化,然后再优化。
    //这是第一步啦。先实现功能才。越简单越好。
    public class Server
    {

        int port = 2222;//设置为默认的值啦。
        Socket server;

        public void Start()
        {
            //首先就是服务器的配置问题啦。
            Console.WriteLine("服务器开始启动。。。。。。。。");
            server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//参数为传输协议。我表示都看不懂
            //协议写好后,我们需要绑定一下这台服务器啦。当然,跑哪里,就绑定哪里的IP地址。路由器之类的什么鬼。
            server.Bind(new IPEndPoint(IPAddress.Any, port));//绑定了服务器的IP啦。自己不知道自己的IP地址。查找以i下吧。IP地址类处理
            Console.WriteLine("服务器监听端口号 : " + port + "。。。。。。。。");
            server.Listen(10);//最多排10个人队伍。如果没有被连接起的话。
             StartAccept();
        }

        public void StartAccept(   )//传递这个数据啦。现在我们不用循环监听啦。
        {
            Console.WriteLine("服务器开始接受客户端的连接请求。。。。。。。。");
            SocketAsyncEventArgs e = new SocketAsyncEventArgs();
            e.Completed += new EventHandler<SocketAsyncEventArgs>(accept_completed);
            // 写好这个类之后就可以监听了。
            server.AcceptAsync(e);//暂时先不用判断同步处理完毕啦。

        }

        //处理客户端连接,保存这个数据的啦。处理客户端连接
        //主要的功能就是拿到这个客户端连接啦。保存在E里面哦。
        public void ProcessAccept(SocketAsyncEventArgs e)
        {
           //接受客户端有什么用啦?
            //我们在这里保存一下连接啦。
            Socket kehuduan = e.AcceptSocket;//保存这个连接。然后怎么处理呢这个连接可以发送信息啦。
            Console.WriteLine("有客户端连接了哦" + kehuduan.RemoteEndPoint.ToString());//有客户端连接啦。
            //然后我们试着发送数据玩完//这个E就不用啦。

        }
        //想客户端发送测试信息。Hi 晓月  有英文和中文哦。
        public void Hi_xiaoyue(Socket kehuduan)
        {
            SocketAsyncEventArgs e = new SocketAsyncEventArgs();
            e.Completed += new EventHandler<SocketAsyncEventArgs>(IO_Completed);
            //我们传递一个BYTE[] 数组进去啦。
            byte[] xinxi = Encoding.Default.GetBytes("Hi 晓月, 你好");//用这个工具编码啦
            //写入一个新的事件当中。
            e.SetBuffer(xinxi , 0 , xinxi.Length);//放置这么多信息进去啦。怎么不直接放进去啦。
            kehuduan.SendAsync(e);//异步加载,会回调。就不判断同步信息了。
        }
        //发送信息。 到时候其他的地方啦。这个是IO完毕的 大家发送了一遍以后再干什么?
        //这个是自己发送的信息。
        //以后再修改啦。
        //这个是判断给客户端发送完信息之后的参数。主要看是不是发送异常。异常就让他下线
        public void ProcessSend( SocketAsyncEventArgs e )
        {
            if (e.SocketError == SocketError.Success)
            {
                Console.WriteLine("客户端成功接受信息");
            }
            else
            {
                Console.WriteLine("客户端没有成功接受信息,不好意思,你要下线了。");
            }
        }

        //这个是异步监听客户端连接的回调方法。
        //接受完成了。回调这个方法啦。
        public void accept_completed(object sender, SocketAsyncEventArgs e)
        {
            ProcessAccept(e);
        }

        public void IO_Completed(object sender, SocketAsyncEventArgs e)
        {
            if (e.LastOperation == SocketAsyncOperation.Receive)//就是上次的执行号啦。
            {
                // 到时候要判断是接收信息还是发送信息,不同的回调。可以从他的反馈得到信息
                ProcessSend(e);
            }
         }

    }
}
1 0