Unity 网络通信(聊天)

连接:


http://blog.csdn.net/chenggong2dm/article/details/7896440



客服端和服务器端整合.

Sence1:判断是作为服务器还是客户端。

using UnityEngine;
using System.Collections;

public class SorC : MonoBehaviour {


	void OnGUI(){  
		_sorc ();
	}

	void _sorc(){
		if (GUILayout.Button("作为服务器")) {
			Application.LoadLevel(1);
		}

		if (GUILayout.Button("")) {
		}

		if (GUILayout.Button("作为客服端")) {
			Application.LoadLevel(3);
		}

	}


      //中文支持
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

Scence2:根据上一步选择进行服务器或客户端配置。

服务器配置:

using UnityEngine;
using System.Collections;

public class ServerConfig : MonoBehaviour {

	//聊天信息  
	string Message = ""; 
	string InputMessage ="";

//	public static string IPMessage ="Ip:";
//	public static string PortMessage ="Port:";
	public static string NameMessage ="Name:";

	//声明一个二维向量   
	Vector2 Sc;  
	void OnGUI(){  
		showConfig ();

	}
	void showConfig(){
		//创建开始滚动视图  
		Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(400),GUILayout.Height(600)); 

		if (GUILayout.Button("服务器初始配置(请删除输入框信息重新输入)")) {

		}

//		IPMessage= GUILayout.TextArea(IPMessage);  

//		PortMessage = GUILayout.TextArea(PortMessage);  

		NameMessage = GUILayout.TextArea(NameMessage);  

		if (GUILayout.Button("确定")){  
			Application.LoadLevel(2);
		}

		//结束滚动视图, 注意, 与开始滚动视图成对出现  
		GUILayout.EndScrollView();  
	}




      //中文支持
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}


客户端配置:

using UnityEngine;
using System.Collections;

public class ClientConfig : MonoBehaviour {

	//聊天信息  
	string Message = ""; 
	string InputMessage ="";

	public static string IPMessage ="Ip:";
//	public static string PortMessage ="Port:";
	public static string NameMessage ="Name:";

	//声明一个二维向量   
	Vector2 Sc;  
	void OnGUI(){  
		showConfig ();

	}
	void showConfig(){
		//创建开始滚动视图  
		Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(400),GUILayout.Height(600)); 

		if (GUILayout.Button("客服端初始配置(请删除输入框信息重新输入)")) {

		}

		IPMessage= GUILayout.TextArea(IPMessage);  

//		PortMessage = GUILayout.TextArea(PortMessage);  

		NameMessage = GUILayout.TextArea(NameMessage);  

		if (GUILayout.Button("确定")){  
			Application.LoadLevel(4);
		}

		//结束滚动视图, 注意, 与开始滚动视图成对出现  
		GUILayout.EndScrollView();  
	}




      //中文支持
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}


Scence3:运行服务器或客服端

服务器:

using UnityEngine;
using System.Collections;

public class server : MonoBehaviour {

	public UITextList textlist;


	int Port = 10000;

	string Message = ""; 
	string InputMessage = "";
	//声明一个二维向量   
	 Vector2 Sc;   


	//OnGUI方法,所有GUI的绘制都需要在这个方法中实现
	void OnGUI(){
		//Network.peerType是端类型的状态:
		//即disconnected, connecting, server 或 client四种
		switch(Network.peerType){
			//禁止客户端连接运行, 服务器未初始化
		case NetworkPeerType.Disconnected:
			StartServer();
			break;
			//运行于服务器端
		case NetworkPeerType.Server:
			OnServer();
			OnClient();
			break;
			//运行于客户端
		case NetworkPeerType.Client:
			break;
			//正在尝试连接到服务器
		case NetworkPeerType.Connecting:
			break;
		}
	}
	
	void StartServer(){
		//当用户点击按钮的时候为true
		if (GUILayout.Button("创建服务器")) {
			//初始化本机服务器端口,第一个参数就是本机接收多少连接
			NetworkConnectionError error = Network.InitializeServer(12,Port,false);
	//		Debug.Log("错误日志"+error);
			switch(error){
			case NetworkConnectionError.NoError:
				break;
			default:
				Debug.Log("服务端错误"+error);
				break;
			}
		}
	}
	
	void OnServer(){
		GUILayout.Label("服务端已经运行,等待客户端连接");
		//Network.connections是所有连接的玩家, 数组[]
		//取客户端连接数. 
		int length = Network.connections.Length;
		//按数组下标输出每个客户端的IP,Port
//		for (int i=0; i<length; i++)
//		{
//			GUILayout.Label("客户端"+i);
//			GUILayout.Label("客户端ip"+Network.connections[i].ipAddress);
//			GUILayout.Label("客户端端口"+Network.connections[i].port);
//		}
		//当用户点击按钮的时候为true
		if (GUILayout.Button("断开服务器")){
			Network.Disconnect();
		}

//		if(haveNewMessage){
//			haveNewMessage=false;
//			textlist.Add (Message);
//		}


		//创建开始滚动视图  
//		Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(280),GUILayout.Height(400));  
		//绘制纹理, 显示内容  
//		GUILayout.Box(Message);  
		//结束滚动视图, 注意, 与开始滚动视图成对出现  
//		GUILayout.EndScrollView();

	}

	bool haveNewMessage=false;

	//接收请求的方法. 注意要在上面添加[RPC]  
	[RPC]  
	void ReciveMessage(string msg, NetworkMessageInfo info){  
		//刚从网络接收的数据的相关信息,会被保存到NetworkMessageInfo这个结构中  
//		Message = "发送端"+info.sender  +"消息"+msg;  
		Message = msg;
		//+"时间"+info.timestamp +"网络视图"+info.networkView  
//		Debug.Log ("aaaaaaaaaaaa");
		haveNewMessage = true;

//		MessageText [0] = Message;




		if(MessageText [3]!=null){
			MessageText [4]=MessageText [3];
		}

		if(MessageText [2]!=null){
			MessageText [3]=MessageText [2];
		}

		if(MessageText [1]!=null){
			MessageText [2]=MessageText [1];
		}
		if(MessageText [0]!=null){
			MessageText [1]=MessageText [0];
		}

		MessageText [0]=Message;

	}  
	
	/* 系统提供的方法,该方法只执行一次 */
	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}


	void OnClient(){  
		//创建开始滚动视图  
//		Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(280),GUILayout.Height(400)); 
		Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(600),GUILayout.Height(600));  

//		if(GUILayout.Box(MessageText [4]!=null)){
//			GUILayout.Box(MessageText [4]);
//		}
//		if(GUILayout.Box(MessageText [3]!=null)){
//			GUILayout.Box(MessageText [3]);
//		}

//		if(GUILayout.Box(MessageText [2]!=null)){
//			GUILayout.Box(MessageText [2]);
//		}
//		if(GUILayout.Box(MessageText [1]!=null)){
//			GUILayout.Box(MessageText [1]);
//		}
//		if(GUILayout.Box(MessageText [0]!=null)){
//			GUILayout.Box(MessageText [0]);
//		}

		for(int i=MessageText.Length-1;i>=0;i--){
			if(MessageText[i]!=null){
				GUILayout.Box(MessageText[i]);
			}
		}

//		if(MessageText [2]!=null){
//			GUILayout.Box(MessageText [2]);
//			GUILayout.Box(MessageText [1]);  
//			GUILayout.Box(MessageText [0]);  
//		}else if(MessageText [1]!=null){
//			GUILayout.Box(MessageText [1]);  
//			GUILayout.Box(MessageText [0]); 
//		}else if(MessageText [0]!=null){
//			//绘制纹理, 显示内容  
//			GUILayout.Box(MessageText [0]); 
//		}

		//文本框  
		InputMessage = GUILayout.TextArea(InputMessage);  
		if (GUILayout.Button("发送")){  

//			string OutMessage="马学淮:"+InputMessage;
			string OutMessage=ServerConfig.NameMessage+":"+InputMessage;

//			Debug.Log("aaaa:"+Config.NameMessage);

			//发送给接收的函数, 模式为全部, 参数为信息  
			networkView.RPC("ReciveMessage", RPCMode.All, OutMessage); 
			InputMessage = "";
		}  
		//结束滚动视图, 注意, 与开始滚动视图成对出现  
		GUILayout.EndScrollView();  
	}  


	string[] MessageText=new string[5];

}


客户端:

using UnityEngine;  
using System.Collections;  

public class client : MonoBehaviour {  
	//要连接的服务器地址  
	//string IP = "127.0.0.1";
//	string IP = "10.80.3.33";

	string IP = "10.80.3.102";//self
//	string IP = "10.80.55.102";//error

	//要连接的端口  
	int Port = 10000;  

	//聊天信息  
	string Message = ""; 
	string InputMessage ="";
	//声明一个二维向量   
	Vector2 Sc;   

	bool IsLogin=false;

	void OnGUI(){  
		//端类型的状态  
		switch(Network.peerType){  
			//禁止客户端连接运行, 服务器未初始化  
		case NetworkPeerType.Disconnected:  
			StartConnect();  
			break;  
			//运行于服务器端  
		case NetworkPeerType.Server:  
			break;  
			//运行于客户端  
		case NetworkPeerType.Client:
			if(!IsLogin){
				IsLogin=true;
				string LoginMessage="用户"+ClientConfig.NameMessage+"已登录";
				networkView.RPC("ReciveMessage", RPCMode.All, LoginMessage); 
			}

			OnClient();
			break;  
			//正在尝试连接到服务器  
		case NetworkPeerType.Connecting:  
			break;  
		}  
	}  
	
	
	void StartConnect(){  
		if (GUILayout.Button("连接服务器")){  
//			NetworkConnectionError error = Network.Connect(IP,Port);  
			NetworkConnectionError error = Network.Connect(ClientConfig.IPMessage,Port);  
		//	Debug.Log("连接状态"+error); 
			switch(error){
			case NetworkConnectionError.NoError:
//				string LoginMessage="用户"+ClientConfig.NameMessage+"已登录";
//				networkView.RPC("ReciveMessage", RPCMode.All, LoginMessage); 
				break;
			default:
				Debug.Log("客服端错误"+error);
				break;
			}
		}  
	} 

	string[] MessageText=new string[5];

	void OnClient(){  
		//创建开始滚动视图  
		Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(600),GUILayout.Height(600));  
		//绘制纹理, 显示内容  
//		GUILayout.Box(Message);  

		for(int i=MessageText.Length-1;i>=0;i--){
			if(MessageText[i]!=null){
				GUILayout.Box(MessageText[i]);
			}
		}


//		if(MessageText [2]!=null){
//			GUILayout.Box(MessageText [2]);
//			GUILayout.Box(MessageText [1]);  
//			GUILayout.Box(MessageText [0]);  
//		}else if(MessageText [1]!=null){
//			GUILayout.Box(MessageText [1]);  
//			GUILayout.Box(MessageText [0]); 
//		}else if(MessageText [0]!=null){
//			//绘制纹理, 显示内容  
//			GUILayout.Box(MessageText [0]); 
//		}

		//文本框  
	//	Message = GUILayout.TextArea(Message);  
		InputMessage = GUILayout.TextArea(InputMessage);  
		if (GUILayout.Button("发送")){  

//			string myMessage="胡明月:"+InputMessage;
			string OutMessage=ClientConfig.NameMessage+":"+InputMessage;
			//发送给接收的函数, 模式为全部, 参数为信息  
			networkView.RPC("ReciveMessage", RPCMode.All, OutMessage); 
			InputMessage = "";
		}  
		//结束滚动视图, 注意, 与开始滚动视图成对出现  
		GUILayout.EndScrollView();  
	}  
	
	//接收请求的方法. 注意要在上面添加[RPC]  
	[RPC]  
	void ReciveMessage(string msg, NetworkMessageInfo info){  
		//刚从网络接收的数据的相关信息,会被保存到NetworkMessageInfo这个结构中  
//		Message = "发送端"+info.sender  +"消息"+msg; 
		Message = msg;

		if(MessageText [3]!=null){
			MessageText [4]=MessageText [3];
		}
		
		if(MessageText [2]!=null){
			MessageText [3]=MessageText [2];
		}

		if(MessageText [1]!=null){
			MessageText [2]=MessageText [1];
		}
		if(MessageText [0]!=null){
			MessageText [1]=MessageText [0];
		}
		MessageText[0]= Message;
	}  
	
	// Use this for initialization  
	void Start () {  
		
	}  
	
	// Update is called once per frame  
	void Update () {  
		
	}  
}  

注意:给接收请求的脚本所绑定的对象,添加网络视图组件(听起来有点绕口)。在菜单上选择component-->miscellaneous-->Net work View。



  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值