闲来无事,研究了下socket~ 文章最后会给出实例链接,如果不想看介绍的可以直接下下来运行。 本人小白一枚,如有错误请看者不奢赐教。
客户端为unity,服务端为vs,都是用c#语言编写。
先说下我对socket的理解,建立连接、通信、释放连接。此为socket通信的三次握手。
对于socket通信,c#底层已经为我们封装好了,我们可以选择使用UDP还是TCP,这里我使用的是TCP连接。
先介绍下socket通信的基础 : **建立连接,发送数据,接收数据,释放连接**。
建立连接 :
// 该类用于阻塞当前线程,并等待信号,接收到继续进行的信号后,释放等待线程
private static ManualResetEvent connectDone = new ManualResetEvent (false);
// 设置ip地址与端口号
IPEndPoint remoteEP = new IPEndPoint (IPAddress.Parse (serverIP), port);
// 创建socket
tcpSockt = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 异步创建socket连接
tcpSockt.BeginConnect (remoteEP, new AsyncCallback (connectCallback), tcpSockt);
if (connectDone.WaitOne (timeOutSec, false)) { // 阻塞当前线程, socket连接成功或超时,流程继续
if (zSocketManager.IsConnected) {
receive (tcpSockt);
return;
} else {
throw new ArgumentException ("连接失败,请检查网络设置");
}
} else {
tcpSockt.Close ();
throw new ArgumentException ("连接失败,请检查网络设置");
}
} catch (Exception e) {
Debug.Log (e.ToString ());
}
发送数据
发送数据时,我们需要与服务定义好一些包头,包括服务器版本号、协议数据长度、协议号等。将这些包头数据与协议数据拼接成真正的数据后通过Socket.Send方法发送给服务器。
public void Send (string data, NetCommand _command)
{
byte[] bytesData = Encoding.UTF8.GetBytes (data); // 字符串转成字节
bytesData = packMsg (bytesData, _command); // 数据添加包头
if (tcpSockt == null || !tcpSockt.Connected)
throw