using UnityEngine; using System.Collections; using System; using System.Threading; using System.Net; using System.Net.Sockets; using System.IO; using mutils; using scopely.msgpacksharp; using structs; public class AsyncSocket { //單例模式 private static AsyncSocket instance; public Socket clientSocket; public string host = "127.0.0.1"; public int hostPort = 23456; public static AsyncSocket GetInstance () { if (instance == null) { instance = new AsyncSocket (); } return instance; } public AsyncSocket () { //建立Socket對象 clientSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //服務器IP地址 IPAddress ipAddress = IPAddress.Parse (host); //這是一個異步的創建鏈接,當鏈接創建成功時調用connectCallback方法 IAsyncResult result = clientSocket.BeginConnect (ipAddress, hostPort, new AsyncCallback (connectCallback), clientSocket); //當鏈接超過5秒還沒成功表示超時,非必須 //這段succ變量,偶爾在Mono裏報錯,實在看不出問題,去掉也沒問題 // bool succ = result.AsyncWaitHandle.WaitOne (); // if (!succ) { // //超時 // Debug.Log ("time out "); // closeSocket (); // } } private void sendCallback (IAsyncResult asyncConnect) { int bytesSent = clientSocket.EndSend (asyncConnect); Debug.Log ("sendCallback: sent" + bytesSent); closeSocket (); } private void connectCallback (IAsyncResult asyncConnect) { Debug.Log ("EndConnect"); clientSocket.EndConnect (asyncConnect); businessComm (); } private void businessComm () { if (!clientSocket.Connected) { Debug.Log ("businessComm clientSocket.Connected false"); closeSocket (); } MemoryStream memStream = new MemoryStream (128); memStream.Write (SocketUtils.Int32ToByte (12345), 0, 4); memStream.Write (SocketUtils.Int32ToByte (78901), 0, 4); MyMessage message = new MyMessage (); message.MyNumber = 99; message.MyString = "abcde"; byte[] datas = MsgPackSerializer.SerializeObject (message); memStream.Write (SocketUtils.Int32ToByte (datas.Length), 0, 4); memStream.Write (datas, 0, datas.Length); byte[] byteData = memStream.GetBuffer (); clientSocket.BeginSend (byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback (sendCallback), clientSocket); } //關閉Socket public void closeSocket () { Debug.Log ("Socket Closed"); clientSocket.Close (); } }
觸發器調用:
c#
void OnTriggerEnter (Collider col) { if (col.gameObject.tag == "Player") { AsyncSocket.GetInstance (); } }