Unity3d 游戏与C 服务器 异步Socket 交互 一

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

Unity3d中提供了Socket供开发者使用,语法和.net中的一致。

一般来说,对于手游客户端,分为两个线程,一个是GLES渲染,另一个就是Socket线程了。

文章转自(http://blog.csdn.net/huutu)


不论是服务器,还是客户端。其间的数据包的接收与发送,都是通过Socket。

比如客户端要登录,我们就新建一个Socket,Connect到帐号服务器。帐号服务器一直在等待客户端的连接,客户端连接进来之后就准备发送接收数据包了。

文章转自(http://blog.csdn.net/huutu)

这一篇只讲服务端的简单模型。


在.net中封装了Socket。

Socket又分为阻塞式和异步这两种。

阻塞,就是说你要往后面走,就必须过等我执行完成。

异步,是说你要往后走,看到我请绕路。

文章转自(http://blog.csdn.net/huutu)

首先介绍Socket的基本用法:

1、新建Socket

2、激活Socket,置为等待客户端连接状态

3、异步Socket,一定要在一个客户端联入之后立即回到等待状态

    private static int m_SocketCount = 0;    private static ManualResetEvent m_ManualResetEvent = new ManualResetEvent(false);


IPEndPoint: 是IP地址和端口的整合类型

Socket:创建Socket是根据IP地址和端口号来创建的

Protocoltype.Tcp:指定使用TCP协议。(关于TCP与UDP,简单说就是TCP确保一个数据包一定发送成功,UDP就不管。详情请百度谷歌360搜索等等)

BeginAccept:开始监听客户端的联入。注意这是一个异步函数。这个函数执行后马上就会执行后面的代码,如果后面没有循环的程序,那么程序就会退出!

所以这里用了ManualResetEvent来等待结果。

我们也可以单开线程来达到这个效果,文章后面会贴上两种方式的代码。

IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("172.16.30.167"), 1223);        Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);        try        {            serverSocket.Bind(ipEndPoint);            serverSocket.Listen(20);            Console.WriteLine("Server Start");            while (true)            {                m_ManualResetEvent.Reset(); //将线程置于非终止状态,也就是等待当前线程完成;                serverSocket.BeginAccept(new AsyncCallback(Accept), serverSocket);                m_ManualResetEvent.WaitOne(); //阻塞主线程,这里的作用是不退出程序;            }        }        catch (System.Exception ex)        {            Console.WriteLine("Exception" + ex);        }

异步Socket方式,每个操作都要求传入一个回调函数。(不然人家执行完了怎么接着往下执行……)

比如上面的BeginAccept 传入了一个回调函数 Accept,并且带了参数serverSocket 。意思就是 BeginAccept执行完毕后会调用Accept并且传入serverSocket。

文章转自(http://blog.csdn.net/huutu)

    public static void Accept(IAsyncResult result)    {        m_ManualResetEvent.Set(); //通知主线程继续;        Socket serverSocket = (Socket)result.AsyncState;        Console.WriteLine("Accept one Client "+(++m_SocketCount));        //已经Accept客户端之后就停止Accept;        Socket receiverSocket = serverSocket.EndAccept(result);        //开始Receive;        StateObject state = new StateObject();        state.m_CurSocket = receiverSocket;        receiverSocket.BeginReceive(state.m_Buffer, 0, StateObject.m_BufferSize, 0, new AsyncCallback(ReceiveCallBack), state);    }

在有客户端联入之后会执行Accept。

这里注意:

一定要调用ManualResetEvent的Set方法通知主线程继续执行,也就是让Socket继续监听客户端的联入。

文章转自(http://blog.csdn.net/huutu)

当客户端联入之后,就要开始客户端与服务器真正的数据交互啦。调用Socket.BeginReceive 。这也是一个异步操作,同样我们要传入一个回调函数。

public static void ReceiveCallBack(IAsyncResult result)    {        String content = String.Empty;        StateObject state = (StateObject)result.AsyncState;        Socket receiverSocket &
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值