[网络]Unity的Socket通讯_1_客户端
2015-10-07 23:01
507 查看
相信很多人用unity开发写Socket网络都会遇到很多问题,我也是自己瞎琢磨,分享下过程,以及遇到的问题和解决办法。
关于socket的原理,以及TCP和UDP等区别,请点这里。
这个应该是socket连接的基础代码。
这里我没有继承Mono类,据说是酱紫就不会在切换场景时被销毁之类的了,反正不需要绑定在OBJ上,就别继承了。
这里我用了单例模式,因为我读书少,懂得不多。我觉得单例模式带给我最大的好处就是,可以决定实例化的时间,以及写内部代码时不用全部static。
这样,我只需要在start方法中,调用GetInstance方法就可以自动连接服务器。这里的单例用了锁,有人问我多线程不加锁会怎样,我也不知道,你猜呢。
openConnect方法里的步骤就是通用步骤了,确定socket类型,绑定ip,然后连接端口。
BeginReceive是个异步接受的方法,听名字就知道异步嘛,他等他的,程序继续跑别的,他会返回一个IAsyncResult类型来显示他的状态等,可以制作心跳包。
当有数据进来时,他会回调Receive方法,并把数据储存在receiveData里。
Receive方法则是对数据进行操作后,并保持继续等待接受,接受后调自己。size表示传进来的数据包长度,如果size小于1,则断开。
关于socket的用法,可以上msdn或者点这里。
关于socket的原理,以及TCP和UDP等区别,请点这里。
public class ConnectToServer { //单例模式 private static ConnectToServer connectserver = null; private static object lockthis = new object(); public static ConnectToServer GetInstance() { if (connectserver == null) lock (lockthis) { if (connectserver == null) connectserver = new ConnectToServer(); } return connectserver; } //构造函数 ConnectToServer() { openConnect(); } private Socket client; private byte[] receiveData = new byte[1024]; private void openConnect() { client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ip = IPAddress.Parse("127.0.0.1");//服务器IP try { client.Connect(ip, 500); Debug.Log("连接服务器成功"); client.BeginReceive(receiveData, 0, receiveData.Length, SocketFlags.None, new AsyncCallback(Receive), null); Debug.Log("开始监听数据……"); } catch (Exception e) { Debug.Log("连接服务器失败,提示:" + e.Message.ToString()); } } private void Receive(IAsyncResult ar) { int size = client.EndReceive(ar); //Debug.Log("收到数据" + size); if (size < 1) { Debug.Log("服务器关闭"); closeConnect(); return; } //……这里操作数据 client.BeginReceive(receiveData, 0, receiveData.Length, SocketFlags.None, new AsyncCallback(Receive), null); } private void closeConnect()//关闭连接 { if (connectserver.client.Connected) connectserver.client.Close(); connectserver.client = null; } }
这个应该是socket连接的基础代码。
这里我没有继承Mono类,据说是酱紫就不会在切换场景时被销毁之类的了,反正不需要绑定在OBJ上,就别继承了。
这里我用了单例模式,因为我读书少,懂得不多。我觉得单例模式带给我最大的好处就是,可以决定实例化的时间,以及写内部代码时不用全部static。
这样,我只需要在start方法中,调用GetInstance方法就可以自动连接服务器。这里的单例用了锁,有人问我多线程不加锁会怎样,我也不知道,你猜呢。
openConnect方法里的步骤就是通用步骤了,确定socket类型,绑定ip,然后连接端口。
BeginReceive是个异步接受的方法,听名字就知道异步嘛,他等他的,程序继续跑别的,他会返回一个IAsyncResult类型来显示他的状态等,可以制作心跳包。
当有数据进来时,他会回调Receive方法,并把数据储存在receiveData里。
Receive方法则是对数据进行操作后,并保持继续等待接受,接受后调自己。size表示传进来的数据包长度,如果size小于1,则断开。
关于socket的用法,可以上msdn或者点这里。
相关文章推荐
- java-模拟tomcat服务器
- Linux socket 初步
- java socket 注意的地方
- java socket 注意的地方
- C#基于socket模拟http请求的方法
- 简单的Ruby中的Socket编程教程
- Socket不能选择本地IP连接问题如何解决
- C#之Socket操作类实例解析
- 使用C#来编写一个异步的Socket服务器
- C#使用Socket快速判断数据库连接是否正常的方法
- 科学知识:理解socket
- php与flash as3 socket通信传送文件实现代码
- 解决time_wait强制关闭socket
- C#使用Socket上传并保存图片的方法
- 深入php socket的讲解与实例分析
- Linux网络编程之UDP Socket程序示例
- Linux网络编程之socket文件传输示例
- filezilla Failed to create listen socket on port 21 for IPv4 解决办法
- php socket方式提交的post详解
- PHP异步调用socket实现代码