• 用unity3d实现简单的主server连接


    unity3d实现简单的主server连接

    參考自鹰大的网络实例

    -------------------------------------------------华丽的切割线-------------------------------------------

    一. UI以及主逻辑

    //值得注意的是

    //1Network.useNat已经不再使用 直接用一个变量替代它

    //2GUILayout.BeginScrollView()有更好的重载函数来使用

    //3Network.InitializeServer(players, port);也已经过时

    //4.測试部分有些函数也已经过时。能够參考圣典做改动

    //5.似乎有连不上主server的问题

    主逻辑函数

    1.Awake()

    l 初始化serveripport

    l 初始化窗体

    l 初始化游戏模式[可选]

    2.OnGUI()

    l 检測是否有连接到server或成为server【開始时至少是正在连接了】

    n 有的话载入场景

    n 若没有 有两种可能:出错了。尚未開始连接[分类处理]

    u 若出错 弹出窗体提示错误

    u 此时一定是还没连接 能够做高速游戏或者玩家自己定义增加两种

    l 若玩家点击了高速游戏 【还没有開始游戏】

    n 调用高速游戏函数

    l 若玩家点击了自己定义游戏

    n 能够创建多种方式让玩家登入[此时设计3种:)]

    u 依据房间列表增加

    u 依据serverip[能够替换成建立server的玩家名称等等]

    u 自己创建一个游戏

    n 玩家能够选择退回到主菜单

    l 若玩家还没有点选此时[应该设计选择UI]

    n 输入玩家姓名

    n 创建高速游戏或自己定义游戏

    实现函数

    1) playNowFunction()高速游戏

    l 能够选择在载入的时候退出游戏

    l 假设尝试足够多次连接主机都没有成功 自己作为server创建一个主机[创建房间]

    l 调用详细处理高速游戏的脚本开启游戏

    n 假设高速游戏返回失败 玩家自己创建一个主机[创建房间]

    n 否则 此时系统正在尝试高速游戏。显示处理进展[比方倒计时]

    下面3个均为窗体回调函数[创建一个适于交互的UI然后增加游戏]

    2) hostGUI()自己一个创建游戏

    l 创建窗体要求玩家输入创建房间的必要信息[使用的port 玩家数目]

    l 确认信息后创建房间

    3) directConnectGUIWindow()通过ip增加游戏

    l 正在连接时 显示消息通知玩家正在连接

    l 否则 此时尚未输入信息 `

    n 玩家输入目标房间信息[ip port  是否useNat]

    n 尝试连接该目标房间

    4) listGUI()房间列表

    l 创建滚动栏[读取显示主机列表中主机的信息]

    l 玩家可主动刷新房间列表[可选]

    l 若列表中没有主机 显式向玩家说明

    二.多人游戏详细实现

    主逻辑函数[主要处理连接出现的问题]

    1. Awake()

    l 主机列表 new空间

    l 连接測试

    l 推断并说明本机ip类型[公有or私有]

    l 改动主server信息[可选]

    2. Start() start中可做协同操作

    l 请求主机列表

    3. Update()

    l 測试Nat

    网络连接函数

    1) OnFailedToConnectToMasterServer(info: NetworkConnectionError)  木有连接到主server

    l 本例中木有提供解决方法

    2) OnFailedToConnect(info: NetworkConnectionError) 连接server失败

    l 调用连接失败处理函数

    3) Connect(ip : String, port : int, usenat : boolean) 连接函数[感觉不是非常必要]

    似乎仅仅在连接失败处理重试时调用 【封装价值不清楚】

    l 依据參数连接server

    l 标识当前正在连接中

    4) OnConnectedToServer() client成功连接到server后调用

    l 标识暂停网络功能的使用 由于在client还在载入的时候,我们要防止从游戏局内发出一些无法识别的网络信息

    l 保存server的ipport到偏好[便于以后的使用]

    实现详细功能的调用函数

    1.FailedConnRetry(info: NetworkConnectionError) 针对连接失败的各种情况进行处理

    l 当登入serverpassword输入有误 此时标识不再重试

    l 当标识当前client正在尝试连接当前server时[有依据主机调用过connect 系统会假定此时仍能够再次连接本server]

    l 若能够重试而且useNat==true而且当前尝试的主机要求NAT穿透 我们此时就不用NAT穿透再连接一次当前server  此处应该忘了对ip记录存储

    l 否则当前的server已经不能再连接了  将useNat重置、尝试过的server+1、标识当前没有正在连接server

    l 当标识当前client没有正在尝试连接当前server时【即没有使用高速游戏開始游戏】//没理解透

    l 因为本例没有对非高速游戏的连接做操作 先标识连接消息为” Failed to connect!”

    l 【似乎走不到这一步。。。

    】当server要求useNat而且client也使用了useNat连接时 不用useNat再尝试一次【不能穿透也有可能连接的 比方没有私有ip的联网公有ip

    l 否则连接一定失败了 

    依据连接失败原因不同传出不同的失败提示、重置port、重置useNat为測试后的正式结果【当前client的实际状况】

    2.TestConnection() 測试Nat 针对正在连接的轮询測试连接 对结果进行反馈操作 1. 測试结果为ConnectionTesterStatus.Error

    说明出现未知问题。可能是没有可用的网络连接 标识完毕Nat測试

    2.  ConnectionTesterStatus.Undetermined:

    说明尚未測试完毕 标识未完毕Nat測试

    3.  ConnectionTesterStatus.PrivateIPNoNATPunchthrough 私有ip、不能做Nat穿透

    此时要过滤使用了Nat穿透的client 此时仅仅能做局域网游戏 标识过滤Nat主机,完毕測试,useNat=true【此处不理解 不是应该不用穿透么???但没出现这个问题不知道详细情况怎样 遇到的朋友帮忙看一下】

    4.  ConnectionTesterStatus.PrivateIPHasNATPunchThrough 私有ip、能做Nat穿透

    若是检測正在探測公有ip。说明公有ip地址不能连接[被port堵塞]

    【若是server。在开启的情况下NAT穿透已经是启用的了。若是client,在主机请求时,开启】

    不论是否能检測到公有ip,都将useNat=true。标识完毕NAT測试

    5. ConnectionTesterStatus.PublicIPIsConnectable

    能够直接连接公有ip地址,标记useNat=false、标识完毕NAT測试

    6. ConnectionTesterStatus.PublicIPNoServerStarted  公有ip被堵塞

    a) 若是不是正在探測公有ip,说明能够绕过防火墙  强制測试NAT连接、标记正在探測公有ip、设计一段时间

    b) 若一段时间后依然堵塞,重置探測公有ip[false]useNat=false、标记完毕NAT測试

    7. 其它情况 出现错误

    最后将当前的useNat标记为正式的Nat状态

    假设測试完毕 将測试情况输出便于检查错误

    对外的调用接口

    l StartHost(players : int, port : int) 创建server 对server初始化封装

    l 若玩家填入小于改动至少为1[保证至少server有一个玩家]

    l 初始化server

    l PlayNow(timeStarted : float ) 高速游戏 通过訪问游戏列表尝试连接全部的游戏

    l 遍历主机列表 寻找没有设定password、过滤穿透且主机没有穿透或者使用穿透且没有过滤的主机【不能穿透就不去穿透】【有一类是不能做穿透的】 找到作标记

    l 若连接server的玩家没有超过限制

    l 而且正在尝试连接高速游戏【感觉这里有问题 连接太久就得让人下线么???】

    l 若连接了太长时间  由定时器中断

    连接重试

    l 假设当前没有正在尝试连接主机 且正在的尝试主机小于当前轮询的主机的编号

    l 标记正在尝试连接高速游戏 正在尝试的主机编号设为当前编号 标记最后连接的主机的useNat和本client的useNat属性与server一致 连接该server 标记最后连接高速连接的时间为当前时间

    l 对主机列表做冒泡排序[目的是让人员较少的房间增大被高速游戏增加的概率 降低等待]

    ·FetchHostList(manual : boolean)  //请求主机限制[更新主机列表]   自己主动每隔2分请求一次 主动每隔5秒请求一次

    三.游戏载入完毕后 处理连接、掉线、状态

    类的主逻辑

    1.Awake()

    同意网络信息传递

    若是server,应该在主server注冊游戏

    2.OnGUI() 轮询处理当前的连接状况

    Network.peerType == NetworkPeerType.Disconnected 已断开

    Network.peerType == NetworkPeerType.Connecting 正在尝试连接

    Network.peerType == NetworkPeerType.Client 当前端是client

    Network.peerType == NetworkPeerType.Server 当前端是server

    能够选择断开

    连接、断开处理

    client:

    1.OnDisconnectedFromServer(info : NetworkDisconnection) 从server断开

    server:

    1.OnPlayerConnected(player: NetworkPlayer) server侦測到client连接到server

    2.OnPlayerDisconnected(player: NetworkPlayer) server侦測到client从server断开

  • 相关阅读:
    transition
    Java自增陷阱
    不同编码格式中,字节和字符的关系
    表单重复提交
    source folder和package的区别
    @test 测试案例不能添加参数
    http协议content-type
    jdbc的缺点和mybatis的优点
    ==和equals的区别
    spring IOC和AOP
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6761490.html
Copyright © 2020-2023  润新知