unity3d 5x以前,可以用NetworkView.RPC的方式进行通信。5x,之后,虽然还可以用networkview建立服务器和客户端,但是NetworkView.RPC的通信方式被取消了。

取代的是用networking下的networkserver和nerworkclient(大概吧,我猜的)


untiy3d 5x,network的服务器端和客户端通信_服务器端

以前类似于下面这样的,应该是不能再用了。

[RPC]
void SpawnBox(NetworkViewID viewID, Vector3 location) {
Transform clone;
clone = Instantiate(cubePrefab, location, Quaternion.identity) as Transform as Transform;
NetworkView nView;
nView = clone.GetComponent<NetworkView>();
nView.viewID = viewID;
}



接下来用新的方法试试:

建立新场景,加上按钮,输入框,文本显示。(不爱用OnGUI)

untiy3d 5x,network的服务器端和客户端通信_网络_02


首先,要引用UnityEngine.Networking

using UnityEngine.Networking;


建立服务器用NetworkServer.Listen

NetworkServer.Listen(4444);


客户端连接的方法是NetworkClient.Connect

NetworkClient myClient;
myClient = new NetworkClient ();
myClient.Connect("127.0.0.1", 8888);


服务器端和客户端的事件都是通过RegisterHandler方法注册的,

下面的例子就是在服务器端注册了一个OnConnected事件,事件是当有客户端连接到服务器端的时候在服务器端触发。

void Start()
{
NetworkServer.Listen(7070);
NetworkServer.RegisterHandler(MsgType.Connect, OnConnected);
}

void OnConnected(NetworkMessage netMsg)
{
Debug.Log ("Client connected");
}


客户端注册事件的方法相同。


接下来,说发送信息。

服务器端发送信息是用NetworkServer.SendToAll或NetworkServer.SendToClient,客户端发送信息用NetworkClient.Send

其中参数Networking.MessageBase msg是一个自己定义的类,但是这个类必须继承自MessageBase

class RegisterHostMessage : MessageBase
{
public string gameName;
public string comment;
public bool passwordProtected;

}



ok,说明完毕,上代码

这是发生信息的类

using UnityEngine.Networking;

public class UserMsg : MessageBase {
public string message;
}


这是主类

using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using System;

public class MyNetworkManager : MonoBehaviour
{
/// <summary>
/// 服务器ip地址
/// </summary>
public InputField ip;
/// <summary>
/// 服务器端口
/// </summary>
public InputField port;
/// <summary>
/// 要发送的信息
/// </summary>
public InputField send;
/// <summary>
/// 显示信息
/// </summary>
public Text info;
/// <summary>
/// 网络客户端
/// </summary>
private NetworkClient myClient;
/// <summary>
/// 用户信息分类
/// </summary>
private const short userMsg = 64;

void Start ()
{
info.text = "Start...";
myClient = new NetworkClient ();
}


/// <summary>
/// 建立服务器
/// </summary>
public void SetupServer ()
{
if (!NetworkServer.active) {
ShowMsg ("setup server");
ServerRegisterHandler ();
NetworkServer.Listen (int.Parse (port.text));

if (NetworkServer.active) {
ShowMsg ("Server setup ok.");
}
}
}

/// <summary>
/// 建立客户端
/// </summary>
public void SetupClient ()
{
if (!myClient.isConnected) {
ShowMsg ("setup client");
ClientRegisterHandler ();
myClient.Connect (ip.text, int.Parse (port.text));
}
}

/// <summary>
/// 停止客户端
/// </summary>
public void ShutdownClient ()
{
if (myClient.isConnected) {
ClientUnregisterHandler ();
myClient.Disconnect ();

//NetworkClient.Shutdown()使用后,无法再次连接。
//This should be done when a client is no longer going to be used.
//myClient.Shutdown ();
}
}

/// <summary>
/// 停止服务器端
/// </summary>
public void ShutdownServer ()
{
if (NetworkServer.active) {
ServerUnregisterHandler ();
NetworkServer.DisconnectAll ();
NetworkServer.Shutdown ();

if (!NetworkServer.active) {
ShowMsg ("shut down server");
}
}
}

/// <summary>
/// 客户端连接到服务器事件
/// </summary>
/// <param name="netMsg">Net message.</param>
private void OnClientConnected (NetworkMessage netMsg)
{
ShowMsg ("Client connected to server");
}

/// <summary>
///客户端从服务器断开事件
/// </summary>
/// <param name="netMsg">Net message.</param>
private void OnClientDisconnected (NetworkMessage netMsg)
{
ShowMsg ("Client disconnected from server");
}

/// <summary>
/// 客户端错误事件
/// </summary>
/// <param name="netMsg">Net message.</param>
private void OnClientError (NetworkMessage netMsg)
{
ClientUnregisterHandler ();
ShowMsg ("Client error");
}



/// <summary>
/// 服务器端有客户端连入事件
/// </summary>
/// <param name="netMsg">Net message.</param>
private void OnServerConnected (NetworkMessage netMsg)
{
ShowMsg ("One client connected to server");
}

/// <summary>
/// 服务器端有客户端断开事件
/// </summary>
/// <param name="netMsg">Net message.</param>
private void OnServerDisconnected (NetworkMessage netMsg)
{
ShowMsg ("One client connected from server");
}

/// <summary>
/// 服务器端错误事件
/// </summary>
/// <param name="netMsg">Net message.</param>
private void OnServerError (NetworkMessage netMsg)
{
ServerUnregisterHandler ();
ShowMsg ("Server error");
}

/// <summary>
/// 显示信息
/// </summary>
/// <param name="Msg">Message.</param>
private void ShowMsg (string Msg)
{
info.text = Msg + "\n\r" + info.text;
//Debug.Log (Msg);
}

/// <summary>
/// 客户端向服务器端发送信息
/// </summary>
public void ClientSend ()
{
if (myClient.isConnected) {
UserMsg um = new UserMsg ();
um.message = send.text;
if (myClient.Send (userMsg, um)) {
ShowMsg ("Client send:" + send.text);
}
}
}

/// <summary>
/// 客户端接收到服务器端信息事件
/// </summary>
/// <param name="netMsg">Net message.</param>
private void ClientGet (NetworkMessage netMsg)
{
UserMsg Msg = netMsg.ReadMessage<UserMsg> ();
ShowMsg ("Client get:"+Msg.message);
}

/// <summary>
/// 服务器端向所有客户端发送信息
/// </summary>
public void ServerSend ()
{
if (NetworkServer.active) {
UserMsg um = new UserMsg ();
um.message = send.text;
if (NetworkServer.SendToAll (userMsg, um)) {
ShowMsg ("Server send:" + send.text);
}
}
}

/// <summary>
/// 服务器端收到信息事件
/// </summary>
/// <param name="netMsg">Net message.</param>
private void ServerGet (NetworkMessage netMsg)
{
UserMsg Msg = netMsg.ReadMessage<UserMsg> ();
ShowMsg ("Server get:"+Msg.message);
}

/// <summary>
/// 服务器端注册事件
/// </summary>
private void ServerRegisterHandler(){
NetworkServer.RegisterHandler (MsgType.Connect, OnServerConnected);
NetworkServer.RegisterHandler (MsgType.Disconnect, OnServerDisconnected);
NetworkServer.RegisterHandler (MsgType.Error, OnServerError);
NetworkServer.RegisterHandler (userMsg, ServerGet);
}

/// <summary>
/// 客户端注册事件
/// </summary>
private void ClientRegisterHandler(){
myClient.RegisterHandler (MsgType.Connect, OnClientConnected);
myClient.RegisterHandler (MsgType.Disconnect, OnClientDisconnected);
myClient.RegisterHandler (MsgType.Error, OnClientError);
myClient.RegisterHandler (userMsg, ClientGet);
}

/// <summary>
/// 客户端注销事件
/// </summary>
private void ClientUnregisterHandler(){
myClient.UnregisterHandler (MsgType.Connect);
myClient.UnregisterHandler (MsgType.Disconnect);
myClient.UnregisterHandler (MsgType.Error);
myClient.UnregisterHandler (userMsg);
}

/// <summary>
/// 服务器端注销事件
/// </summary>
private void ServerUnregisterHandler(){
NetworkServer.UnregisterHandler (MsgType.Connect);
NetworkServer.UnregisterHandler (MsgType.Disconnect);
NetworkServer.UnregisterHandler (MsgType.Error);
NetworkServer.UnregisterHandler (userMsg);
}
}


运行结果如下

untiy3d 5x,network的服务器端和客户端通信_通信_03