整个项目用到的网络通信主要用来发送图片的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);
}