Unity【Multiplayer 多人在线】- Socket 通用客户端网络模块(三)、Send 发送数据
【摘要】
介绍
在阅读了罗培羽著作的Unity3D网络游戏实战一书后,博主综合自己的开发经验与考虑进行部分修改和调整,将通用的客户端网络模块和通用的服务端框架进行提取,形成专栏,介绍Socket网络编程,希望对其他人有所帮助。目录如下:
一、通用服...
介绍
在阅读了罗培羽著作的Unity3D网络游戏实战一书后,博主综合自己的开发经验与考虑进行部分修改和调整,将通用的客户端网络模块和通用的服务端框架进行提取,形成专栏,介绍Socket网络编程,希望对其他人有所帮助。目录如下:
一、通用服务端框架
二、通用客户端网络模块
(三)、Send 发送数据
本篇内容:
Send 发送数据:
首先定义写入队列writeQueue,并将writeQueue在初始化函数Init中进行初始化:
//写入队列
private static Queue<ByteArray> writeQueue;
Send回调函数中会判断写入队列是否还有数据,如果写入队列不为空,继续发送数据:
//发送数据
public static void Send(IExtensible proto)
{
//状态判断
if (socket == null || !socket.Connected) return;
if (isConnecting || isClosing) return;
//数据编码
byte[] nameBytes = ProtoUtility.EncodeName(proto);
byte[] bodyBytes = ProtoUtility.Encode(proto);
int len = nameBytes.Length + bodyBytes.Length;
byte[] sendBytes = new byte[2 + len];
//组装长度
sendBytes[0] = (byte)(len % 256);
sendBytes[1] = (byte)(len / 256);
//组装名字
Array.Copy(nameBytes, 0, sendBytes, 2, nameBytes.Length);
//组装消息体
Array.Copy(bodyBytes, 0, sendBytes, 2 + nameBytes.Length, bodyBytes.Length);
//写入队列
ByteArray ba = new ByteArray(sendBytes);
int count = 0;
lock (writeQueue)
{
writeQueue.Enqueue(ba);
count = writeQueue.Count;
}
//Send
if (count == 1)
{
socket.BeginSend(sendBytes, 0, sendBytes.Length, 0, SendCallback, socket);
}
}
//Send回调
private static void SendCallback(IAsyncResult ar)
{
//获取State、EndSend的处理
Socket socket = (Socket)ar.AsyncState;
//状态判断
if (socket == null || !socket.Connected) return;
//EndSend
int count = socket.EndSend(ar);
//获取写入队列第一条数据
ByteArray ba;
lock (writeQueue)
{
ba = writeQueue.First();
}
//完整发送
ba.readIdx += count;
if (ba.length == 0)
{
lock (writeQueue)
{
writeQueue.Dequeue();
ba = writeQueue.Count > 0 ? writeQueue.First() : null;
}
}
//继续发送
if (ba != null)
{
socket.BeginSend(ba.bytes, ba.readIdx, ba.length, 0, SendCallback, socket);
}
//正在关闭
else if (isClosing)
{
socket.Close();
}
}
参考资料:《Unity3D网络游戏实战》(第2版)罗培羽 著
文章来源: coderz.blog.csdn.net,作者:CoderZ1010,版权归原作者所有,如需转载,请联系作者。
原文链接:coderz.blog.csdn.net/article/details/124094323
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)