[Unity3D ARPG網絡游戲編程實踐]
想殺人了,百度了半天也不知道本地服務怎么寫,結果資源里的服務器竟然可以用了~~~~(>_<)~~~~
使用了兩種方法
1 這個方法特別郁悶,自己寫服務器,自己寫客戶端可以通訊。可是這個服務器用在 [Unity3D ARPG網絡游戲編程實踐] 中就不能鏈接成功,還好資源里帶有啟動本地服務的程序,不會原因,不懂服務器鏈接的原理
宣雨松版服務器客戶端通訊代碼
服務器端 using UnityEngine; using System.Collections; public class localServer : MonoBehaviour { int port = 10110; void OnGUI() { switch (Network.peerType) { case NetworkPeerType.Client://成功連接至客戶端 break; case NetworkPeerType.Connecting://正在嘗試連接 break; case NetworkPeerType.Disconnected://未啟動狀態,在此開始網絡連接 StartServer(); break; case NetworkPeerType.Server://成功連接服務器 OnServer(); break; } } void StartServer() { if (GUILayout.Button("創建本地服務器")) { //創建本地服務器允許10台主機連接,第三個參數:是否支持nat方式的連接 NetworkConnectionError error = Network.InitializeServer(10, port, false); //如果連接失敗打印錯誤信息 Debug.Log("連接狀態:" + error); } } void OnServer() { GUILayout.Label("服務器創建完畢,等待用戶連接"); //得到用戶的連接數量 int length = Network.connections.Length; for (int i = 0; i < length; i++) { GUILayout.Label("連接服務器客戶端的ID:" + i); GUILayout.Label("連接服務器客戶端IP:" + Network.connections[i].ipAddress); GUILayout.Label("連接服務器客戶端端口號:" + Network.connections[i].port); } if (GUILayout.Button("斷開本地連接")) { Network.Disconnect(); } } } 客戶端代碼 using UnityEngine; using System.Collections; public class clientServer : MonoBehaviour { //要連接的服務器地址 //string IP = "192.168.110.231"; string IP = "127.0.0.1"; //要連接的端口 int Port = 10110; void OnGUI() { //端類型的狀態 switch (Network.peerType) { //禁止客戶端連接運行, 服務器未初始化 case NetworkPeerType.Disconnected: StartConnect(); break; //運行於服務器端 case NetworkPeerType.Server: break; //運行於客戶端 case NetworkPeerType.Client: break; //正在嘗試連接到服務器 case NetworkPeerType.Connecting: break; } } void StartConnect() { if (GUILayout.Button("連接服務器")) { NetworkConnectionError error = Network.Connect(IP, Port); Debug.Log("連接狀態" + error); } } }
2 [Unity3D ARPG網絡游戲編程實踐] 視頻資源
只有客戶端代碼(注意,networkSript1類沒有繼承自MonoBehaviour,不能直接添加給照相機,可以在照相機組件視窗中add newscript添加腳本)
using UnityEngine; using System.Collections; using System.Net.Sockets; public class networkSript1{ private static networkScript instance; private static Socket socket; private static string IP = "127.0.0.1"; private static int port = 10100; public static networkScript getInstance() { if (instance == null) { instance = new networkScript(); init(); } return instance; } public static void init() { try { socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(IP, port); Debug.Log("服務器連接成功"); } catch { Debug.Log("服務器連接失敗"); } } }
具體操作:
1 刪除攝像機,使用NGUI添加小部件
2 創建資源並給場景添加button
3 給攝像機添加網絡連接腳本:networkSript1類沒有繼承自MonoBehaviour,不能直接添加給照相機,可以在照相機組件視窗中add newscript添加腳本
3.1 socket對象(inter網連接類型,流方式傳輸,tcp協議)
3.2 函數Connect(ip,port)
4 在button的回調函數中添加連接代碼
總結
Socket.BeginReceive 方法 (Byte[], Int32, Int32, SocketFlags, SocketError, AsyncCallback, Object)
開始從連接的 Socket 中異步接收數據。
public IAsyncResult BeginReceive(
byte[] buffer,
int offset,
int size,
SocketFlags socketFlags,
out SocketError errorCode,
AsyncCallback callback,
Object state
)
參數
buffer
類型:System.Byte[]
Byte 類型的數組,它是存儲接收到的數據的位置。
offset
類型:System.Int32
buffer 中存儲所接收數據的位置。
size
類型:System.Int32
要接收的字節數。
socketFlags
類型:System.Net.Sockets.SocketFlags
SocketFlags 值的按位組合。
errorCode
類型:System.Net.Sockets.SocketError
一個 SocketError 對象,它存儲套接字錯誤。
callback
類型:System.AsyncCallback
一個 AsyncCallback 委托,它引用操作完成時要調用的方法。
state
類型:System.Object
一個用戶定義對象,其中包含接收操作的相關信息。 當操作完成時,此對象會被傳遞給 EndReceive 委托。
返回值
類型:System.IAsyncResult
引用異步讀的 IAsyncResult。