Red de conocimiento informático - Conocimiento informático - Cómo pasar datos a Unity a través de un socket

Cómo pasar datos a Unity a través de un socket

Para usar Socket en Unity, necesitas importar clases en el espacio de nombres System.Net.Sockets.

El siguiente es un ejemplo de un programa cliente de Unity que usa Socket para recibir datos:using?System;?

using?System.Collections.Generic;?

usando?System.Linq;?

usando?System.Text;?

usando?System.Net;?

usando?System.Net. ¿Sockets;?

usando?System.Threading;?

usando?UnityEngine;? ?clase ?SocketHelper?

{?

privado?static?SocketHelper?socketHelper=new?SocketHelper();

privado?Socket?socket;?

p>

//?Pieza única

public?static?SocketHelper?GetInstance()?

{?

return?socketHelper ;?

}?

private?SocketHelper()?{?

//¿Conectar usando TCP?

socket?=? new?Socket (AddressFamily.InterNetwork,?SocketType.Stream,?ProtocolType.Tcp);?

//Dirección IP del servidor?

IPAddress?address?=?IPAddress.Parse( "127.0.0.1");?

//¿Puerto del servidor?

IPEndPoint?endpoint?=?new?IPEndPoint(dirección,8000);? // Conexión asincrónica, ¿la conexión es exitosa y se llama al método connectCallback?

IAsyncResult?result?=?socket.BeginConnect(endpoint,?new?AsyncCallback(ConnectCallback),?socket);

//Aquí ¿Realizar un monitoreo de tiempo de espera? Cuando la conexión supera los 5 segundos y no ha sido exitosa, ¿indica un tiempo de espera?

bool?success?=?result.AsyncWaitHandle.WaitOne(5000) ,?verdadero);?

si?(!éxito)?

{?

//¿Tiempo de espera?

Cerrado() ;?

Debug.Log( "conectar? ¿Tiempo de espera?");?

}?

else?

{?

//Establecer una conexión con el socket. Con éxito, se abre el hilo para recibir datos del servidor.

?

¿Hilo?thread?=?new?Thread(new?ThreadStart(ReceiveSorket));?

thread.IsBackground?=?true;?

thread.Start();?

}?

}?

¿privado?void?ConnectCallback(IAsyncResult?asyncConnect)?

{?

Debug.Log("connect?success");?

}?

¿privado?void?ReceiveSorket()?

{?

//¿Aceptar los datos devueltos por el servidor en este hilo?

while?(true)?

{?

if?(!socket.Connected)?

{?

//¿Desconectarse del servidor y salir del bucle?

Depurar. Log("¿Error ?al?clientSocket?servidor.");?

socket.Close();?

romper;?

}?

probar?

{?

//¿Aceptar datos y guardarlos en bytes?

byte[]?bytes?=?new? byte[4096]; ?

//¿El método de recepción siempre esperará a que el servidor envíe un mensaje?

//Si no hay respuesta, siempre esperará aquí .

?

int?i?=?socket.Receive(bytes);?

if?(i?<=?0)?

{?

socket.Close();?

romper;?

}?

Debug.Log(System.Text.Encoding.Default .GetString(bytes));?

}?

¿capturar?(¿Excepción?e)?

{?

Depurar. Log("¿Error?en?clientSocket?error."?+?e);?

socket.Close();?

romper;?

}?

}?

}?

//¿Cerrar socket?

¿público?void?Closed()?

{?

si?(socket?!=?null?&&?socket.Connected)?

{?

socket.Shutdown( SocketShutdown.Both);?

socket.Close();?

}?

socket?=?null;?

}?

//¿Enviar una cadena al servidor?

//Normalmente no se envía una cadena. ¿Debería ser un paquete de datos?

¿público? void?SendMessage(string?str)?

{?

byte[]?msg?=?Encoding.UTF8.GetBytes(str);? si?(!socket.Connected)?

{?

socket.Close();?

return;?

} ?

¿intentar?

{?

IAsyncResult?asyncSend?=?socket.BeginSend(msg,?0,?msg.Length,?SocketFlags.None ,?new?AsyncCallback(SendCallback),?socket);?

bool?success?=?asyncSend.AsyncWaitHandle.WaitOne(5000,?true);?

si?( !éxito)?

{?

socket.Close();?

Debug.Log("¿Error? en? Enviar mensaje? servidor."); ?

}?

}?

captura?

{?

Debug.Log("enviar ?mensaje?error");?

}?

}?

¿privado?void?SendCallback(IAsyncResult?asyncConnect)?

{?

Debug.Log("enviar? Éxito");?

}

}