Unity 网络通信(聊天)

来源:互联网 发布:美国经济评论数据公开 编辑:程序博客网 时间:2024/05/29 13:46
连接:


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 initializationvoid Start () {}// Update is called once per framevoid 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 initializationvoid Start () {}// Update is called once per framevoid 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 initializationvoid Start () {}// Update is called once per framevoid 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(){//当用户点击按钮的时候为trueif (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);//}//当用户点击按钮的时候为trueif (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 initializationvoid Start () {}// Update is called once per framevoid 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