018-直接利用Socket/TCP开发网络游戏一

由于在前几天,我已经花了很多的时间在fishingJoy上面的,在这里就不写了,因为在写一遍也没有什么作用。

今天我们正式开始网络部分的学习,在这个网络的部分我们直接是使用c#中的socket来开发的,所有,这样就会更加直接,相对于用框架而言。如其他的类一样,vs也把网络部分封装成一个类,这样就大大减少了我们开发的难度。在此之前,我们还是有必要来了解一下网络部分的基础知识。就是IP与端口号。

网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。IP地址具有唯一性,根据用户性质的不同,可以分为5类。另外,IP还有进入防护,知识产权,指针寄存器等含义。

网络技术中,端口(Port)包括逻辑端口和物理端口两种类型。物理端口指的是物理存在的端口,如ADSL Modem、集线器交换机路由器上用 于连接其他网络设备的接口,如RJ-45端口、SC端口等等。逻辑端口是指逻辑意义上用于区分服务的端口,如TCP/IP协议中的服务端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等。由于物理端口和逻辑端口数量较多,为了对端口进行区分,将每个端口进行了编号,这就是端口号

以上就是有关IP与端口号的解释,我们对于这个只要知道一下就行了,IP与端口号绑定才能上网。

说到网络连接,我们只要要讲到TCP的三次握手,与四次挥手。只有完成三次握手,客户端与服务器端才能进行通信。只有完成四次挥手,客户端与服务器端才能完成断开连接,否则会报错。

我们首先创建一个解决方案,叫TCP服务器端,要注意的一点就是是客户端端向服务器端发起请求。

 //实例化服务器端
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //获得IP地址
            IPAddress iPAddress = IPAddress.Parse("127.0.0.1");
            //端口号与IP地址
            IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, 88);
            //服务器端绑定IP地址与端口号
            serverSocket.Bind(iPEndPoint);
            serverSocket.Listen(0);

首先创建一个服务器的socket类,将其中的类型,写好,在其中设定IP地址与端口号,并进行绑定。

serverSocket.BeginAccept(AcceptCallBack, serverSocket);

接着就是开始接受,注意的是这里需要有一个回调函数,接着

 static void AcceptCallBack(IAsyncResult ar)
        {
            Socket serverSocket = ar.AsyncState as Socket;
            Socket clientSocket = serverSocket.EndAccept(ar);
            string msg = "Hello Client 您好...";
            byte[] data = Encoding.UTF8.GetBytes(msg);
            clientSocket.Send(data);

            clientSocket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReceiveCallBack, clientSocket);
            serverSocket.BeginAccept(AcceptCallBack, serverSocket);
        }

开始写回调函数,将用于返回的socket定义成服务器socket,将结束接受并传来的socket定义成客服端socket,服务器端向客户端发送一个信息,表示已经正常连接了,接受客户端向服务器端传送信息,就是begin receive方法。但是这个方法也是需要回调函数的,所以我们还要写

 static void ReceiveCallBack(IAsyncResult ar)
        {
            Socket clientSocket = null;
            try
            {
                clientSocket = ar.AsyncState as Socket;
                int count = clientSocket.EndReceive(ar);
                if (count == 0)
                {
                    clientSocket.Close();
                    return;
                }
                string msg = Encoding.UTF8.GetString(dataBuffer, 0, count);
                Console.WriteLine("从客户端接受到的数据:" + msg);
                clientSocket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReceiveCallBack, clientSocket);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                if (clientSocket != null)
                {
                    clientSocket.Close();
                }
            }
        }

如果你在方法中穿的是什么,那个这个AsyncState的类型就是什么,得到客户端发送结束的信息,并把它说出,因为客户端有可能多次的发送数据,所以我们需要在其中在写调用自己的方法,这样,就可以再次输出数据的了,前面的再次调用接受也是一样的,这样写的是为了可以接受多个客户端。接下来:

static void Main(string[] args)
        {
            ServerAsync();
            Console.ReadKey();
        }

以上是服务器端的部分,接下来就是客户端的部分了。

前面的基本操作也是一样的:

static void Main(string[] args)
        {
            //创建客户端的的socket类
            Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //与客户端的进行绑定
            clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 88));
            byte[] data = new byte[1024];
            int count = clientSocket.Receive(data);
            string msg = Encoding.UTF8.GetString(data, 0, count);
            Console.Write(msg);
            while (true)
            {
                string s = Console.ReadLine();
                if (s == "c")
                {
                    clientSocket.Close();
                    return;
                }
                //向客户端发送信息
                clientSocket.Send(Encoding.UTF8.GetBytes(s));
            }
            Console.ReadKey();
            clientSocket.Close();
        }

其实就是这么多。我们要注意的是 127.0.0.1是主机就是localhost。今天的部分就是这么多。

posted @ 2018-10-30 08:55  jake_caiee  阅读(635)  评论(0编辑  收藏  举报