涂涂乐的详细实现之五--网络通信(NetWorkView)

来源:互联网 发布:天下3捏脸大赛数据 编辑:程序博客网 时间:2024/05/17 03:46

整个项目用到的网络通信主要用来发送图片的byte[]以及string类型等。

首先分别在客户端和服务端的MainCamera中添加组件NetworkView,并添加脚本组件。

服务端的创建代码如下:

void Start()    {        for (int i = 0; i < 10; i++)        {            //Debug.Log("AnimalsName[i].ToString():"+AnimalsName[i].ToString());            scanpath[i] = Directory.GetParent(Application.dataPath).ToString() + "/ServerGet/" + AnimalsName[i].ToString();            //Debug.Log("scanpath[i]:"+scanpath[i]);            //scanpath = "G:/scan/scanimgServerGet/";            DirectoryInfo theFolder = new DirectoryInfo(scanpath[i]);            if (!Directory.Exists(scanpath[i]))            {                Directory.CreateDirectory(scanpath[i]);            }            load(i);        }        fromscanpath = Directory.GetParent(Application.dataPath).ToString() + "/ServerGet/FromScan";        if (!Directory.Exists(fromscanpath))        {            Directory.CreateDirectory(fromscanpath);        }        letterpath = Directory.GetParent(Application.dataPath).ToString() + "/ServerGet/FromScan";        if (!Directory.Exists(letterpath))        {            Directory.CreateDirectory(letterpath);        }        //Network.peerType是端类型的状态:           //即disconnected, connecting, server 或 client四种           switch (Network.peerType)        {            //禁止客户端连接运行, 服务器未初始化               case NetworkPeerType.Disconnected:                StartServer();                break;            //运行于服务器端               case NetworkPeerType.Server:                OnServer();                break;            //运行于客户端               case NetworkPeerType.Client:                break;            //正在尝试连接到服务器               case NetworkPeerType.Connecting:                break;        }    }    void StartServer()    {        //初始化本机服务器端口,第一个参数就是本机接收多少连接           NetworkConnectionError error = Network.InitializeServer(12, Port, false);        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);            GUILayout.Label("-----------------------------------------");        }        if (GUILayout.Button("断开服务器"))        {            Network.Disconnect();        }        sc = GUILayout.BeginScrollView(sc, GUILayout.Width(280), GUILayout.Height(400));            GUILayout.Box(Message);        GUILayout.EndScrollView();            }
客户端的连接代码如下:
void OnGUI()    {        //端类型的状态          switch (Network.peerType)        {            //禁止客户端连接运行, 服务器未初始化              case NetworkPeerType.Disconnected:                if (GUI.Button(new Rect(Screen.width / 2, Screen.height / 2, 100, 30), "连接服务器"))                {                    NetworkConnectionError error = Network.Connect(IP, Port);                    //连接状态                      switch (error)                    {                        case NetworkConnectionError.NoError:                            break;                        default:                            Debug.Log("客户端错误" + error);                            break;                    }                }                break;            //运行于服务器端            case NetworkPeerType.Server:                break;            //运行于客户端            case NetworkPeerType.Client:                //OnClient();                bool OnClient = true;                break;            //正在尝试连接到服务器            case NetworkPeerType.Connecting:                break;        }    }

客户端的发送调用函数如下:

public void SendButton()    {        byte[] bytes = SendTexture.EncodeToPNG();        GetComponent<NetworkView>().RPC("FromScan", RPCMode.All, bytes);    }    [RPC]    void FromScan(byte[] bytes, NetworkMessageInfo info)    {        Debug.Log("zc");    }
客户端的数据接收如下:

  

  [RPC]    void FromScan(byte[] bytes, NetworkMessageInfo info)    {        bytesToImg(bytes);        Texture2D tex = new Texture2D(100,100);        tex.LoadImage(bytes);//将来自客户端发送的byte转成Texture        tihuanTexture[0] = tex;        tex = rotateNinty(tex);//tex顺时针旋转九十度        tihuanTexture[1] = tex;        tex = GetBottomRight(tex);//tex是右下角字母格        tihuanTexture[2] = tex;        byte[] bytess = tex.EncodeToPNG();        EmguTest.GetBytes(bytess);    }

0 0