您的位置:首页 > 理论基础 > 计算机网络

[Unity3D ARPG网络游戏编程实践]1——初识unity网络编程

2020-02-03 01:53 1151 查看

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

 

转载于:https://www.cnblogs.com/lv-sally/p/4563890.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
dichuzhi7828 发布了0 篇原创文章 · 获赞 0 · 访问量 174 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: