zoukankan      html  css  js  c++  java
  • 网络游戏基础知识

    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);
                }
            }
        }
    }
  • 相关阅读:
    android 启动报错
    android 百度地图
    android LayoutInflater使用
    spring mvc No mapping found for HTTP request with URI [/web/test.do] in DispatcherServlet with name 'spring'
    sql mysql和sqlserver存在就更新,不存在就插入的写法(转)
    jsp include
    json 解析
    css
    Scrapy组件之item
    Scrapy库安装和项目创建
  • 原文地址:https://www.cnblogs.com/Optimism/p/12245417.html
Copyright © 2011-2022 走看看