网络游戏基础知识

1、多个玩家如何进行网络通信 ?

每个玩家都是在客户端,如果需要相互之间进行通信,需要通过一个很大的服务器进行消息传递;

 

那么玩家和服务器怎么进行通信,用什么进行通信?

一个玩家肯定有一台计算机,而计算就应该有自己的IP地址,假如一个程序qq想要和另一台计算机的qq通信应该怎么办?

首先在计算机两端都应该建立Socket,其实看似是两个程序之间的通信,其实就是两个Socket之间的通信,一个用于发送消息,而另一个用于接收消息;

那么为什么一个Socket和另一个Socket之间可通信呢? 其实只要知道两个计算机的IP地址和彼此之间的端口号就可以实现,说到底,他们之间实现通信,

就是因为端口号和端口号之间的通信。

 

就比如一台计算机上有qq和微信两个应用程序,甚至可以安装更多的程序,但是一台计算机只有一个IP地址,那么他们之间并不会产生冲突,如何实现?

就是他们一定选择了不同的端口号进行信息的传递,就这么简单。

 

2、在Unity当中实现信息传递的一个简单实例

 

--------------------------------------客户端--------------------------------------------------

我们假设Unity编写出来的程序位客户端,如何写一个客户端程序?

客户端应该要完成3件事

1)能够连接到服务器,应该有一个连接按钮;

2)能够向服务器发送消息,就应该有一个输入消息框和一个发送按钮;

3)能够接收服务器发来的消息,有一个接收框。

 

接下来就需要写脚本实现上面的功能

1、写连接方法,然后注册到连接按钮上,也就是注册事件;

2、写发送方法,然后注册到发送按钮上;

完整代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net.Sockets;
using UnityEngine.UI;

public class Echo : MonoBehaviour
{
    //定义套接字
    Socket socket;

    //定义UGUI
    public InputField inputField;
    public Text text;

    // 点击连接按钮
    public void Connection()
    {
        //Socket
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        //Connect
        socket.Connect("127.0.0.1", 8888);
    }

    // 点击发送按钮
    public void Send()
    {
        //Send 
        string sendStr = inputField.text;
        byte[] sendBytes = System.Text.Encoding.Default.GetBytes(sendStr);
        socket.Send(sendBytes);

        //Receive
        byte[] readBuff = new byte[1024];
        int count = socket.Receive(readBuff);
       string recvStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);
        text.text = recvStr;

        //Close
        socket.Close();
    }
}

 

 

------------------------------------------------------服务器----------------------------------------------------------

 

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

namespace EchoServer
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World1");

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

            //Bind
            IPAddress ipAdr = IPAddress.Parse("127.0.0.1");
            IPEndPoint ipEp = new IPEndPoint(ipAdr, 8888);
            listenfd.Bind(ipEp);

            //Listen
            listenfd.Listen(0);
            Console.WriteLine("[服务器] 启动成功");
            while (true)
            {
                //Accept
                Socket connfd = listenfd.Accept();
                Console.WriteLine("[服务器] Accept");

                //Receive
                byte[] readBuff = new byte[1024];
                int count = connfd.Receive(readBuff);
                string readStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);
                Console.WriteLine("[服务器接收]" + readStr);

                //Send
                byte[] sendBytes = System.Text.Encoding.Default.GetBytes(readStr);
                connfd.Send(sendBytes);
            }
        }
    }
}

 

posted @ 2020-01-31 14:58  彩色的梦  阅读(480)  评论(0编辑  收藏  举报