zoukankan      html  css  js  c++  java
  • [Unity3D ARPG网络游戏编程实践]1——初识unity网络编程

    [Unity3D ARPG网络游戏编程实践]

    想杀人了,百度了半天也不知道本地服务怎么写,结果资源里的服务器竟然可以用了~~~~(>_<)~~~~
    使用了两种方法
    1 这个方法特别郁闷,自己写服务器,自己写客户端可以通讯。可是这个服务器用在 [Unity3D ARPG网络游戏编程实践] 中就不能链接成功,还好资源里带有启动本地服务的程序,不会原因,不懂服务器链接的原理
    宣雨松版服务器客户端通讯代码

    服务器端
    using UnityEngine;
    using System.Collections;
    
    public class localServer : MonoBehaviour {
    
        int port = 10110;
        void OnGUI()
        {
            switch (Network.peerType)
            {
                case NetworkPeerType.Client://成功连接至客户端
                    break;
                case NetworkPeerType.Connecting://正在尝试连接
                    break;
                case NetworkPeerType.Disconnected://未启动状态,在此开始网络连接
                    StartServer();
                    break;
                case NetworkPeerType.Server://成功连接服务器
                    OnServer();
                    break;
                
            }
        }
    
        void StartServer()
        {
            if (GUILayout.Button("创建本地服务器"))
            {
                //创建本地服务器允许10台主机连接,第三个参数:是否支持nat方式的连接
                NetworkConnectionError error = Network.InitializeServer(10, port, false);
                //如果连接失败打印错误信息
                Debug.Log("连接状态:" + error);
            }
        }
    
        void OnServer()
        {
            GUILayout.Label("服务器创建完毕,等待用户连接");
            //得到用户的连接数量
            int length = Network.connections.Length;
            for (int i = 0; i < length; i++)
            {
                GUILayout.Label("连接服务器客户端的ID:" + i);
                GUILayout.Label("连接服务器客户端IP:" + Network.connections[i].ipAddress);
                GUILayout.Label("连接服务器客户端端口号:" + Network.connections[i].port);
            }
    
            if (GUILayout.Button("断开本地连接"))
            {
                Network.Disconnect();
            }
        }
    }
    
    
    
    客户端代码
    
    using UnityEngine;
    using System.Collections;
    
    public class clientServer : MonoBehaviour {
    
        //要连接的服务器地址  
        //string IP = "192.168.110.231";
        string IP = "127.0.0.1";
        //要连接的端口  
        int Port = 10110;
    
        void OnGUI()
        {
            //端类型的状态  
            switch (Network.peerType)
            {
                //禁止客户端连接运行, 服务器未初始化  
                case NetworkPeerType.Disconnected:
                    StartConnect();
                    break;
                //运行于服务器端  
                case NetworkPeerType.Server:
                    break;
                //运行于客户端  
                case NetworkPeerType.Client:
                    break;
                //正在尝试连接到服务器  
                case NetworkPeerType.Connecting:
                    break;
            }
        }
    
    
        void StartConnect()
        {
            if (GUILayout.Button("连接服务器"))
            {
                NetworkConnectionError error = Network.Connect(IP, Port);
                Debug.Log("连接状态" + error);
            }
        }  
    }
    

      

    2 [Unity3D ARPG网络游戏编程实践] 视频资源
    只有客户端代码(注意,networkSript1类没有继承自MonoBehaviour,不能直接添加给照相机,可以在照相机组件视窗中add newscript添加脚本)

    using UnityEngine;
    using System.Collections;
    using System.Net.Sockets;
    
    public class networkSript1{
        private static networkScript instance;
        private static Socket socket;
    
        private static string IP = "127.0.0.1";
        private static int port = 10100;
    
        public static networkScript getInstance()
        {
            if (instance == null)
            {
                instance = new networkScript();
                init();
            }
            return instance;
        }
    
        public static void init()
        {
            try
            {
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket.Connect(IP, port);
                Debug.Log("服务器连接成功");
            }
            catch
            {
    
                Debug.Log("服务器连接失败");
            }
        }
    }
    

      

    具体操作:
    1 删除摄像机,使用NGUI添加小部件
    2 创建资源并给场景添加button
    3 给摄像机添加网络连接脚本:networkSript1类没有继承自MonoBehaviour,不能直接添加给照相机,可以在照相机组件视窗中add newscript添加脚本
    3.1 socket对象(inter网连接类型,流方式传输,tcp协议)
    3.2 函数Connect(ip,port)
    4 在button的回调函数中添加连接代码

    总结
    Socket.BeginReceive 方法 (Byte[], Int32, Int32, SocketFlags, SocketError, AsyncCallback, Object)
    开始从连接的 Socket 中异步接收数据。

    public IAsyncResult BeginReceive(
    byte[] buffer,
    int offset,
    int size,
    SocketFlags socketFlags,
    out SocketError errorCode,
    AsyncCallback callback,
    Object state
    )
    参数
    buffer
    类型:System.Byte[]
    Byte 类型的数组,它是存储接收到的数据的位置。
    offset
    类型:System.Int32
    buffer 中存储所接收数据的位置。
    size
    类型:System.Int32
    要接收的字节数。
    socketFlags
    类型:System.Net.Sockets.SocketFlags
    SocketFlags 值的按位组合。
    errorCode
    类型:System.Net.Sockets.SocketError
    一个 SocketError 对象,它存储套接字错误。
    callback
    类型:System.AsyncCallback
    一个 AsyncCallback 委托,它引用操作完成时要调用的方法。
    state
    类型:System.Object
    一个用户定义对象,其中包含接收操作的相关信息。 当操作完成时,此对象会被传递给 EndReceive 委托。

    返回值
    类型:System.IAsyncResult
    引用异步读的 IAsyncResult。

  • 相关阅读:
    django ajax报错解决:You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set.
    django使用session报错:no such table: django_session
    centos7下yum安装mariadb
    pip报错解决:EnvironmentError: mysql_config not found
    django报错解决:view must be a callable or a list/tuple in the case of include().
    onpageshow和onpagehide
    深入理解Linux的CPU上下文切换
    看完就彻底懂了红黑树!红黑树的插入、删除、左旋、右旋
    shell根据csv生成sql
    shell中的EOF用法
  • 原文地址:https://www.cnblogs.com/lv-sally/p/4563890.html
Copyright © 2011-2022 走看看