Unity3d 两个编辑器之间的Unity 3D通信
我正在尝试使用简单的tcp客户端/服务器设置在两个编辑器之间传输一些数据: 服务器:Unity3d 两个编辑器之间的Unity 3D通信,unity3d,networking,tcp,Unity3d,Networking,Tcp,我正在尝试使用简单的tcp客户端/服务器设置在两个编辑器之间传输一些数据: 服务器: using System; using System.Collections; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using UnityEngine; public class TCPTe
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
public class TCPTestServer : MonoBehaviour {
#region private members
/// <summary>
/// TCPListener to listen for incomming TCP connection
/// requests.
/// </summary>
private TcpListener tcpListener;
/// <summary>
/// Background thread for TcpServer workload.
/// </summary>
private Thread tcpListenerThread;
/// <summary>
/// Create handle to connected tcp client.
/// </summary>
private TcpClient connectedTcpClient;
#endregion
// Use this for initialization
void Start () {
// Start TcpServer background thread
tcpListenerThread = new Thread (new ThreadStart(ListenForIncommingRequests));
tcpListenerThread.IsBackground = true;
tcpListenerThread.Start();
}
// Update is called once per frame
void Update () {
SendMessage();
}
/// <summary>
/// Runs in background TcpServerThread; Handles incomming TcpClient requests
/// </summary>
private void ListenForIncommingRequests () {
try {
// Create listener on localhost port 8052.
tcpListener = new TcpListener(IPAddress.Parse("myip"), 65535);
tcpListener.Start();
Debug.Log("Server is listening");
Byte[] bytes = new Byte[1024];
while (true) {
using (connectedTcpClient = tcpListener.AcceptTcpClient()) {
// Get a stream object for reading
using (NetworkStream stream = connectedTcpClient.GetStream()) {
int length;
// Read incomming stream into byte arrary.
while ((length = stream.Read(bytes, 0, bytes.Length)) != 0) {
var incommingData = new byte[length];
Array.Copy(bytes, 0, incommingData, 0, length);
// Convert byte array to string message.
string clientMessage = Encoding.ASCII.GetString(incommingData);
Debug.Log("client message received as: " + clientMessage);
}
}
}
}
}
catch (SocketException socketException) {
Debug.Log("SocketException " + socketException.ToString());
}
}
/// <summary>
/// Send message to client using socket connection.
/// </summary>
private void SendMessage() {
if (connectedTcpClient == null) {
return;
}
try {
// Get a stream object for writing.
NetworkStream stream = connectedTcpClient.GetStream();
if (stream.CanWrite) {
string serverMessage = this.gameObject.transform.position.ToString();
// Convert string message to byte array.
byte[] serverMessageAsByteArray = Encoding.ASCII.GetBytes(serverMessage);
// Write byte array to socketConnection stream.
stream.Write(serverMessageAsByteArray, 0, serverMessageAsByteArray.Length);
Debug.Log("Server sent his message - should be received by client");
}
}
catch (SocketException socketException) {
Debug.Log("Socket exception: " + socketException);
}
}
void OnApplicationQuit()
{
tcpListenerThread.Abort();
connectedTcpClient.Close ();
}
}
使用系统;
使用系统集合;
使用System.Collections.Generic;
Net系统;
使用System.Net.Sockets;
使用系统文本;
使用系统线程;
使用UnityEngine;
公共类TCPTestServer:MonoBehavior{
#区域私人成员
///
///TCPListener侦听是否输入TCP连接
///请求。
///
私人TcpListener TcpListener;
///
///TcpServer工作负载的后台线程。
///
私有线程tcpListenerThread;
///
///创建连接到tcp客户端的句柄。
///
专用TCP客户端连接的TCP客户端;
#端区
//用于初始化
void Start(){
//启动TcpServer后台线程
tcpListenerThread=newthread(newthreadstart(ListenForIncommingRequests));
tcpListenerThread.IsBackground=true;
tcpListenerThread.Start();
}
//每帧调用一次更新
无效更新(){
SendMessage();
}
///
///在后台TcpServerThread中运行;处理未提交的TcpClient请求
///
私有void listenforincomingrequests(){
试试{
//在本地主机端口8052上创建侦听器。
tcpListener=newtcplistener(IPAddress.Parse(“myip”),65535);
tcpListener.Start();
Log(“服务器正在侦听”);
字节[]字节=新字节[1024];
虽然(正确){
正在使用(connectedTcpClient=tcpListener.AcceptTcpClient()){
//获取用于读取的流对象
使用(NetworkStream=connectedTcpClient.GetStream()){
整数长度;
//将输入流读入字节数组。
而((length=stream.Read(bytes,0,bytes.length))!=0){
var incommingData=新字节[长度];
复制(字节,0,输入数据,0,长度);
//将字节数组转换为字符串消息。
string clientMessage=Encoding.ASCII.GetString(输入数据);
Log(“接收的客户端消息为:“+clientMessage”);
}
}
}
}
}
catch(SocketException SocketException){
Log(“SocketException”+SocketException.ToString());
}
}
///
///使用套接字连接向客户端发送消息。
///
私有void SendMessage(){
如果(connectedTcpClient==null){
返回;
}
试试{
//获取用于写入的流对象。
NetworkStream=connectedTcpClient.GetStream();
如果(stream.CanWrite){
string serverMessage=this.gameObject.transform.position.ToString();
//将字符串消息转换为字节数组。
字节[]serverMessageAsByteArray=Encoding.ASCII.GetBytes(serverMessage);
//将字节数组写入socketConnection流。
Write(serverMessageAsByteArray,0,serverMessageAsByteArray.Length);
Log(“服务器发送了他的消息-客户端应该收到”);
}
}
catch(SocketException SocketException){
Log(“套接字异常:+socketException”);
}
}
在Application Quit()上无效
{
tcpListenerThread.Abort();
connectedTcpClient.Close();
}
}
客户:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
public class TCPTestClient : MonoBehaviour {
#region private members
private TcpClient socketConnection;
private Thread clientReceiveThread;
#endregion
// Use this for initialization
void Start () {
ConnectToTcpServer();
}
// Update is called once per frame
void Update () {
if (Input.GetKeyDown(KeyCode.Space)) {
SendMessage();
}
}
/// <summary>
/// Setup socket connection.
/// </summary>
private void ConnectToTcpServer () {
try {
clientReceiveThread = new Thread (new ThreadStart(ListenForData));
clientReceiveThread.IsBackground = true;
clientReceiveThread.Start();
}
catch (Exception e) {
Debug.Log("On client connect exception " + e);
}
}
/// <summary>
/// Runs in background clientReceiveThread; Listens for incomming data.
/// </summary>
private void ListenForData() {
try {
socketConnection = new TcpClient("myip", 65535);
Byte[] bytes = new Byte[1024];
while (true) {
// Get a stream object for reading
using (NetworkStream stream = socketConnection.GetStream()) {
int length;
// Read incomming stream into byte arrary.
while ((length = stream.Read(bytes, 0, bytes.Length)) != 0) {
var incommingData = new byte[length];
Array.Copy(bytes, 0, incommingData, 0, length);
// Convert byte array to string message.
string serverMessage = Encoding.ASCII.GetString(incommingData);
Debug.Log("server message received as: " + serverMessage);
}
}
}
}
catch (SocketException socketException) {
Debug.Log("Socket exception: " + socketException);
}
}
/// <summary>
/// Send message to server using socket connection.
/// </summary>
private void SendMessage() {
if (socketConnection == null) {
return;
}
try {
// Get a stream object for writing.
NetworkStream stream = socketConnection.GetStream();
if (stream.CanWrite) {
string clientMessage = "This is a message from one of your clients.";
// Convert string message to byte array.
byte[] clientMessageAsByteArray = Encoding.ASCII.GetBytes(clientMessage);
// Write byte array to socketConnection stream.
stream.Write(clientMessageAsByteArray, 0, clientMessageAsByteArray.Length);
//Debug.Log("Client sent his message - should be received by server");
}
}
catch (SocketException socketException) {
Debug.Log("Socket exception: " + socketException);
}
}
void OnApplicationQuit()
{
clientReceiveThread.Abort();
socketConnection.Close ();
}
}
使用系统;
使用系统集合;
使用System.Collections.Generic;
使用System.Net.Sockets;
使用系统文本;
使用系统线程;
使用UnityEngine;
公共类TCPTestClient:MonoBehavior{
#区域私人成员
专用TCP客户端套接字连接;
私有线程clientReceiveThread;
#端区
//用于初始化
无效开始(){
connecttotcserver();
}
//每帧调用一次更新
无效更新(){
if(Input.GetKeyDown(KeyCode.Space)){
SendMessage();
}
}
///
///设置套接字连接。
///
私有void connecttotcserver(){
试试{
clientReceiveThread=新线程(新线程开始(ListenForData));
clientReceiveThread.IsBackground=true;
clientReceiveThread.Start();
}
捕获(例外e){
Log(“在客户端连接异常上”+e);
}
}
///
///在后台clientReceiveThread中运行;侦听输入数据。
///
私有void ListenForData(){
试试{
socketConnection=新的TcpClient(“myip”,65535);
字节[]字节=新字节[1024];
虽然(正确){
//得到