用unity3d实现简单的主server连接
用unity3d实现简单的主server连接
-------------------------------------------------华丽的切割线-------------------------------------------
一. UI以及主逻辑
//值得注意的是
//1、Network.useNat已经不再使用 直接用一个变量替代它
//2、GUILayout.BeginScrollView()有更好的重载函数来使用
//3、Network.InitializeServer(players, port);也已经过时
//4.測试部分有些函数也已经过时。能够參考圣典做改动
//5.似乎有连不上主server的问题
主逻辑函数
1.Awake()
l 初始化serverip和port
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的ip和port到偏好[便于以后的使用]
实现详细功能的调用函数
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 改动至少为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断开
用unity3d实现简单的主server连接的更多相关文章
- 简单的sql server连接
private string constring="data source=112.74.73.122;initial catalog=qzyData;user id=sa;password ...
- Sql Server 连接池及其用法
其实我们一直在使用SqlServer的连接池.在连接字符串中,Pooling为是否启用连接池,默认值为true,表示启用. 与连接池相关的两个重要参数是 Min Pool Size和 Max Pool ...
- 【J2EE】Java连接SQL Server 2000问题:“com.microsoft.sqlserver.jdbc.SQLServerException:用户'sa'登录失败。该用户与可信SQL Server连接无关联”
1.问题现象 E:\JSP\HibernateDemo\HibernateDemoProject\src\sine>java ConnectSQLServerConnect failed!com ...
- [ASP.NET]SQL Server 连接字符串和身份验证
SQL Server .NET Data Provider 连接字符串包含一个由一些属性名/值对组成的集合.每一个属性/值对都由分号隔开. PropertyName1=Value1; Property ...
- SQL Server 连接字符串和身份验证
SQL Server .NET Data Provider 连接字符串包含一个由一些属性名/值对组成的集合.每一个属性/值对都由分号隔开. PropertyName1=Value1;P ...
- .NET SQL Server连接字符串句法
.NET SQL Server连接字符串句法 数据库的连接性已经发展成为应用程序开发的一个标准方面.数据库连接字符串现在已经成为每个项目的标准必备条件.我发现自己为了找到所需要的句法,经常要从另外一个 ...
- SQL Server 连接问题-TCP/IP
原文:SQL Server 连接问题-TCP/IP 出自:http://blogs.msdn.com/b/apgcdsd/archive/2012/02/24/ms-sql-server-tcp-ip ...
- 编写一个简单的Web Server
编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...
- SQL Server AlwaysOn 集群 关于主Server IP与Listener IP调换的详细测试
1. 背景 SQL Server 搭建AlwaysOn后,我们就希望程序连接时使用虚拟的侦听IP(Listener IP),而不再是主Server 的IP.如果我们有采用中间件,则可以在配置中,直接用 ...
随机推荐
- JDK7集合框架源码阅读(六) HashSet与LinkedHashSet
基于版本jdk1.7.0_80 java.util.HashSet java.util.LinkedHashSet 代码如下 HashSet,312行 /* * Copyright (c) 1997, ...
- Ubuntu14.04 在右键中添加 在终端中打开
1.在terminal中执行: sudo apt-get install nautilus-open-terminal 此时可能会提示:nable to locate package nautilus ...
- 用了GradientDrawable后,当点击控件时,控件大小发生变化
android新手:发现一个很奇怪的问题,用了GradientDrawable后,当点击控件时,程序自动使我的一些控件大小保持一致,为什么呢,我就是不想它们保持一致啊 改了好久好久:GradientD ...
- UVA——442 Matrix Chain Multiplication
442 Matrix Chain MultiplicationSuppose you have to evaluate an expression like A*B*C*D*E where A,B,C ...
- 【NOIP模拟赛】【数学真奇妙】【递推】旅行者问题
旅行者问题 [问题描述] lahub是一个旅行者的粉丝,他想成为一个真正的旅行者,所以他计划开始一段旅行.lahub想去参观n个目的地(都在一条直道上).lahub在起点开始他的旅行.第i个目的地和起 ...
- 【转载】GCC 预处理器选项
预处理器选项(Preprocessor Option) 下列选项针对C预处理器,预处理器用在正式编译以前,对C 源文件进行某种处理. 如果指定了`-E'选项, GCC只进行预处理工作.下面的某些选项必 ...
- Intel VTune性能分析器基础
https://wenku.baidu.com/view/b0fe162ebd64783e09122b66.html
- 64位系统下powerdesigner15连接oracle odbc
操作系统:win2008 64 Oracle版本:64位11g PowerDesigner版本:15.1 问题描述:因为PowerDesigner是32的程序,连接数据库会默认开启32位的ODBC,因 ...
- 【IntellJ IDEA】idea的Terminal窗口中文乱码 解决方法
在操作git命令在windows上的idea中的terminal窗口时,总是出现中文乱码的问题 本开始以为是git乱码的问题,如果是GIt中文乱码,解决方案:https://www.cnblogs.c ...
- 一篇不错的讲解Java异常的文章(转载)----感觉很不错,读了以后很有启发
六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? OutputStreamWriter ou ...