[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。
