在上一个例子基础上,我们构建一个聊天室程序。

1,首先建立一个新项目,文件夹名为chat。

2,给接收请求的脚本所绑定的对象,添加网络视图组件(听起来有点绕口)。我们的服务器脚本是绑定在主摄像机上的,所以点击主摄像机,在菜单上选择component-->miscellaneous-->Net work View。

服务器端程序:(C# 脚本)


[csharp]  view plain copy



    1. using UnityEngine;  
    2. using System.Collections;  
    3.   
    4. public class server : MonoBehaviour {  
    5.       
    6. int Port = 10100;  
    7. string Message = "";  
    8. //声明一个二维向量   
    9.     Vector2 Sc;   
    10.       
    11. //OnGUI方法,所有GUI的绘制都需要在这个方法中实现  
    12. void OnGUI(){  
    13. //Network.peerType是端类型的状态:  
    14. //即disconnected, connecting, server 或 client四种  
    15. switch(Network.peerType){  
    16. //禁止客户端连接运行, 服务器未初始化  
    17. case NetworkPeerType.Disconnected:  
    18.                 StartServer();  
    19. break;  
    20. //运行于服务器端  
    21. case NetworkPeerType.Server:  
    22.                 OnServer();  
    23. break;  
    24. //运行于客户端  
    25. case NetworkPeerType.Client:  
    26. break;  
    27. //正在尝试连接到服务器  
    28. case NetworkPeerType.Connecting:  
    29. break;  
    30.         }  
    31.     }  
    32.       
    33. void StartServer(){  
    34. //当用户点击按钮的时候为true  
    35. if (GUILayout.Button("创建服务器")) {  
    36. //初始化本机服务器端口,第一个参数就是本机接收多少连接  
    37. false);  
    38. //连接状态  
    39. switch(error){  
    40. case NetworkConnectionError.NoError:  
    41. break;  
    42. default:  
    43. "服务端错误"+error);  
    44. break;  
    45.             }  
    46.         }  
    47.     }  
    48.       
    49. void OnServer(){  
    50. "服务端已经运行,等待客户端连接");  
    51. //Network.connections是所有连接的玩家, 数组[]  
    52. //取客户端连接数.   
    53. int length = Network.connections.Length;  
    54. //按数组下标输出每个客户端的IP,Port  
    55. for (int i=0; i<length; i++)  
    56.         {  
    57. "客户端"+i);  
    58. "客户端ip"+Network.connections[i].ipAddress);  
    59. "客户端端口"+Network.connections[i].port);  
    60. "-------------------------------");  
    61.         }  
    62. //当用户点击按钮的时候为true  
    63. if (GUILayout.Button("断开服务器")){  
    64.             Network.Disconnect();  
    65.         }  
    66. //创建开始滚动视图  
    67.         Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(280),GUILayout.Height(400));  
    68. //绘制纹理, 显示内容  
    69.         GUILayout.Box(Message);  
    70. //结束滚动视图, 注意, 与开始滚动视图成对出现  
    71.         GUILayout.EndScrollView();    
    72.     }  
    73.       
    74. //接收请求的方法. 注意要在上面添加[RPC]  
    75.     [RPC]  
    76. void ReciveMessage(string msg, NetworkMessageInfo info){  
    77. //刚从网络接收的数据的相关信息,会被保存到NetworkMessageInfo这个结构中  
    78. "发送端"+info.sender  +"消息"+msg;  
    79. //+"时间"+info.timestamp +"网络视图"+info.networkView  
    80.     }  
    81.       
    82.       
    83. // Use this for initialization  
    84. void Start () {  
    85.       
    86.     }  
    87.       
    88. // Update is called once per frame  
    89. void Update () {  
    90.       
    91.     }  
    92. }


    4,把脚本拖拽到主摄像机上,绑定。

    5,运行程序 File---->Build settings---->Build And Run,选择Web Player

    6,服务器端建立完毕,保持服务器端的运行状态。

    7,简单起见,我们这里不新建项目。先把摄像机上的服务器脚本删掉,再把下面的客户端脚本拖拽上去。

    客户端代码:


    [csharp]  view plain copy


    1. using UnityEngine;  
    2. using System.Collections;  
    3.   
    4. public class client : MonoBehaviour {  
    5. //要连接的服务器地址  
    6. string IP = "127.0.0.1";  
    7. //要连接的端口  
    8. int Port = 10100;  
    9. //聊天信息  
    10. string Message = "";  
    11. //声明一个二维向量   
    12.     Vector2 Sc;   
    13.           
    14. void OnGUI(){  
    15. //端类型的状态  
    16. switch(Network.peerType){  
    17. //禁止客户端连接运行, 服务器未初始化  
    18. case NetworkPeerType.Disconnected:  
    19.                 StartConnect();  
    20. break;  
    21. //运行于服务器端  
    22. case NetworkPeerType.Server:  
    23. break;  
    24. //运行于客户端  
    25. case NetworkPeerType.Client:  
    26.                 OnClient();  
    27. break;  
    28. //正在尝试连接到服务器  
    29. case NetworkPeerType.Connecting:  
    30. break;  
    31.         }  
    32.     }  
    33.           
    34. void StartConnect(){  
    35. if (GUILayout.Button("连接服务器")){  
    36.             NetworkConnectionError error = Network.Connect(IP,Port);  
    37. //连接状态  
    38. switch(error){  
    39. case NetworkConnectionError.NoError:  
    40. break;  
    41. default:  
    42. "客户端错误"+error);  
    43. break;  
    44.             }  
    45.         }  
    46.     }  
    47.       
    48. void OnClient(){  
    49. //创建开始滚动视图  
    50.         Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(280),GUILayout.Height(400));  
    51. //绘制纹理, 显示内容  
    52.         GUILayout.Box(Message);  
    53. //文本框  
    54.         Message = GUILayout.TextArea(Message);  
    55. if (GUILayout.Button("发送")){  
    56. //发送给接收的函数, 模式为全部, 参数为信息  
    57. "ReciveMessage", RPCMode.All, Message);  
    58.         }  
    59. //结束滚动视图, 注意, 与开始滚动视图成对出现  
    60.         GUILayout.EndScrollView();  
    61.           
    62.     }  
    63.       
    64. //接收请求的方法. 注意要在上面添加[RPC]  
    65.     [RPC]  
    66. void ReciveMessage(string msg, NetworkMessageInfo info){  
    67. //刚从网络接收的数据的相关信息,会被保存到NetworkMessageInfo这个结构中  
    68. "发送端"+info.sender  +"消息"+msg;  
    69.     }  
    70.           
    71. // Use this for initialization  
    72. void Start () {  
    73.       
    74.     }  
    75.       
    76. // Update is called once per frame  
    77. void Update () {  
    78.       
    79.     }  
    80. }


    服务端运行状态:


    [Unity3d] Network 聊天_客户端

    客户端运行状态:


    [Unity3d] Network 聊天_Network_02