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