您的位置:首页 > 移动开发 > Unity3D

UnitySocket通讯,实现连个设备进行消息通讯

2016-03-08 14:03 381 查看
在日常项目中经常需要用的两个电脑直接发送消息,或者用手机给电脑发送消息,来实现控制的效果。本文就是实现效果为,两台设备直接的通过socket进行通讯,在一台设备的电脑端或者手机端点击不同按钮可以在另一台设备上进行对应的显示模型。

服务端,点击按钮发送消息。

using UnityEngine;
using System.Collections;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

public class SendMessage : MonoBehaviour
{

private static byte[] result = new byte[1024];
IPAddress ip;
Socket clientSocket;
// Use this for initialization
void Start ()
{
ip = IPAddress.Parse("192.168.1.157");
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
clientSocket.Connect(new IPEndPoint(ip, 8009)); //配置服务器IP与端口
Debug.Log("连接服务器成功");
}
catch
{
Debug.Log("连接服务器失败,请按回车键退出!");
return;
}
int receiveLength = clientSocket.Receive(result);
Debug.Log("接收服务器消息:" + Encoding.ASCII.GetString(result, 0, receiveLength));

}

// Update is called once per frame
void Update ()
{
//if (Input.GetMouseButtonDown(0))
//{
// Send(1);
//}
}

void Send(int index)
{
string sendMessage = index.ToString();
clientSocket.Send(Encoding.ASCII.GetBytes(sendMessage));
Debug.Log("向服务器发送消息:" + sendMessage);
Thread.Sleep(1000);
}
//public void SenceToLv01()
//{
// Send(1001);
//}
//public void SenceToLv02()
//{
// Send(1002);
//}
//public void SenceToLv03()
//{
// Send(1003);
//}

}


客户端,根据接受到的效果进行对应的控制
using System;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
using System.Threading;
namespace PlayerReceive
{
class PlayerReceive : MonoBehaviour
{
private static byte[] result = new byte[1024];
private static int myProt = 8009; //端口
static Socket serverSocket;
private static int SencenNum=0;
Thread MainThread;
public GameObject[] obj;
/// <summary>
/// 监听客户端连接
/// </summary>

// ~PlayerReceive()
// {
// MainThread.Abort();
// }

void Start()
{
DontDestroyOnLoad(this.gameObject);
IPAddress ip = IPAddress.Parse("192.168.1.157");
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(ip, myProt)); //绑定IP地址:端口
serverSocket.Listen(10); //设定最多10个排队连接请求
Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());
//通过Clientsoket发送数据
MainThread = new Thread(ListenClientConnect);
MainThread.Start();
}
void Update()
{

//if(SencenNum==1)
//{
// // Application.LoadLevel("lv001");
// loadModel(0, 1, 2);
// return;
//}
//if (SencenNum == 2)
//{
// //Application.LoadLevel("lv002");
// loadModel(1, 0, 2);
// return;
//}
//if (SencenNum == 3)
//{
// //Application.LoadLevel("lv003");
// loadModel(2, 1, 0);
// return;
//}

}
//void loadModel(int index1,int index2,int index3)
//{
// obj[index1].SetActive(true);
// obj[index2].SetActive(false);
// obj[index3].SetActive(false);
//}
private static void ListenClientConnect()
{
while (true)
{
Socket clientSocket = serverSocket.Accept();
clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello"));
Thread receiveThread = new Thread(ReceiveMessage);
receiveThread.Start(clientSocket);
}
}

/// <summary>
/// 接收消息
/// </summary>
/// <param name="clientSocket"></param>
private static void ReceiveMessage(object clientSocket)
{
Socket myClientSocket = (Socket)clientSocket;
Boolean b = true;
while (b)
{
try
{
//通过clientSocket接收数据
int receiveNumber = myClientSocket.Receive(result);
// Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber));
string str = Encoding.ASCII.GetString(result, 0, receiveNumber);
if (str.Equals(""))
{
b = false;
}
else
{
Debug.Log(str);
//具体接受到的内容
if (str.Equals("1001"))
{
//Debug.Log("12345");
// Application.LoadLevel("lv001");
SencenNum = 1;
}
if (str.Equals("1002"))
{
//Debug.Log("12345");
//Application.LoadLevel("lv002");
SencenNum = 2;
}
if (str.Equals("1003"))
{
//Debug.Log("12345");
//Application.LoadLevel("lv003");
SencenNum = 3;
}
}
}
catch(Exception ex)
{
Debug.Log(ex.Message);
myClientSocket.Shutdown(SocketShutdown.Both);
myClientSocket.Close();
break;
}
}
}
}
}


重点要说的是,需要注意IP地址和端口问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity socket 设备通讯