[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。