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

[网络]Unity的Socket通讯_1_客户端

2015-10-07 23:01 507 查看
相信很多人用unity开发写Socket网络都会遇到很多问题,我也是自己瞎琢磨,分享下过程,以及遇到的问题和解决办法。

关于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或者点这里
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Unity Socket