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

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

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



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

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



首先,要引用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);
	}
}

运行结果如下




代码下载地址:http://download.csdn.net/detail/wuyt2008/9506591



  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值