1年前的unity3D项目里面之封装了引擎层。完全没涉及到服务器收发。
最近继续深入u3d了。打算弄个框架。自然这个socket要我自己写了。花了1天的时间大概写好了。自己写了一个服务器一个客户端测了一下。
还不错。哈哈哈。
废话不说上代码.
使用双线程收发。这里有个取巧。
我在每帧更新之前。在主线程调用收线程的数据。
在每帧更新之后。在主线程发送数据到发线程。
这样我收和发的过程中不用锁。哈哈。完全不影响主线程。
虽然我是为客户端写的。但是还是考虑了极限情况。比如一次收到太多消息。导致一个缓冲区不够。我用一个链表后背缓冲区持续不断的收。
一次性做成包。主线程去拿。基本上可以当服务器用了。客户端可不会有这么恶心的情况。导致64k缓冲区都不够,那只能是服务器
主程有点二了。
一样的还是不能在收发线程里面做任何有关u3DAPI的调用。这二的。。
上类
netrecevice
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Xml.Xsl;
using System.IO;
using System.Threading;
namespace Lusuo
{
public class NetRecevice : NetBase
{
public NetRecevice(Socket sock,uint uSize)
: base("recevice", sock, uSize)
{
m_stream = new LusuoStream(new byte[uSize]);
}
public override void Stop()
{
base.Stop();
m_stream.Close();
for (int i = 0; i < m_listBackStream.Count; i ++ )
{
m_listBackStream[i].Close();
}
}
public override void SubWork()
{
if (!m_socket.Connected)
{
//接收线程不能等待。因为没人去激活它
Thread.Sleep(15);
return;
}
ReceiveMessage();
//接收完了。转换成消息等待前台拿
GetReceviceToMsg();
//接受完了休息指定帧数默认60帧
Thread.Sleep(15);
}
//
private void ReceiveMessage()
{
LusuoStream stream = __ReceviceMessage(ref m_stream);
while (null != stream)
{
stream = __ReceviceMessage(ref stream);
}
m_stream.Reset();