Как я должен использовать сокеты асинхронно между двумя разными ПК?Мой вопрос возник из-за того, что до сих пор приложение работало в режиме loopback, инициализируя клиент и сервер на одном ПК.
Но я не знаю, как установить соединение между двумя удаленными ПК по той же асинхронной схеме, что и я.have.
Это мой слушатель:
public class Escuchar {
ManualResetEvent todoListo = new ManualResetEvent(false);
public delegate void Recibido(Serializador r);
public event Recibido objetoRecibido;
Socket escuchador;
public void Comenzar(int puerto) {
escuchador = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
escuchador.Bind(new IPEndPoint(IPAddress.Loopback, puerto));
Console.WriteLine("\n\nServidor iniciado.");
EsperarRespuesta();
}
public void EsperarRespuesta() {
todoListo.Reset();
escuchador.Listen(100);
escuchador.BeginAccept(Aceptar, escuchador);
}
public void Aceptar(IAsyncResult resultado) {
Serializador respuesta = new Serializador();
respuesta.Socket = ((Socket) resultado.AsyncState).EndAccept(resultado);
respuesta.Socket.BeginReceive(respuesta.buffer, 0, respuesta.buffer.Length, SocketFlags.None, Receive, respuesta);
}
public void Receive(IAsyncResult resultado) {
Serializador respuesta = (Serializador) resultado.AsyncState;
int read = respuesta.Socket.EndReceive(resultado);
if (read > 0) {
for (int i = 0; i < read; i++) {
respuesta.TransmisionBuffer.Add(respuesta.buffer[i]);
}
if (read == respuesta.buffer.Length) {
respuesta.Socket.BeginReceive(respuesta.buffer, 0, respuesta.buffer.Length, SocketFlags.None, Receive, respuesta);
Console.WriteLine("\n\nNo encaja!");
} else {
Listo(respuesta);
}
} else {
Listo(respuesta);
}
}
public void Listo(Serializador respuesta) {
Console.WriteLine("\n\nDeserializando respuesta...");
Serializador deserializado = respuesta.Deserializar();
objetoRecibido(deserializado);
todoListo.Set();
}
}
Это мой сериализатор:
[Serializable]
public class Serializador {
[NonSerialized]
public Socket Socket;
[NonSerialized]
public List < byte > TransmisionBuffer = new List < byte > ();
[NonSerialized]
public byte[] buffer = new byte[1024];
public ClaseGuardarJuego claseGuardarJuego = new ClaseGuardarJuego();
public byte[] Serializar() {
SoapFormatter formatter = new SoapFormatter();
MemoryStream mem = new MemoryStream();
formatter.Serialize(mem, this);
return mem.GetBuffer();
}
public Serializador Deserializar() {
try {
byte[] datosBuffer = TransmisionBuffer.ToArray();
SoapFormatter formatter = new SoapFormatter();
MemoryStream mem = new MemoryStream();
mem.Write(datosBuffer, 0, datosBuffer.Length);
mem.Seek(0, 0);
return (Serializador) formatter.Deserialize(mem);
} catch (SerializationException e) {
Console.WriteLine("\n\nFallo la deserializacion. Razón: " + e.Message);
return null;
}
}
}
Это мой отправитель:
public class Enviar {
ManualResetEvent todoListo = new ManualResetEvent(false);
Serializador respuesta = new Serializador();
private int puerto;
public void ConfigurarClase(Juego game, Jugador player) {
respuesta.claseGuardarJuego.SetDatos(game, player);
}
public void Comenzar(int puerto) {
this.puerto = puerto;
Console.WriteLine("\n\nCliente esperando por una conexion...");
todoListo.Reset();
Socket emisor = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
emisor.BeginConnect(new IPEndPoint(IPAddress.Loopback, puerto), Conectar, emisor);
todoListo.WaitOne();
}
public void Conectar(IAsyncResult resultado) {
try {
respuesta.Socket = (Socket) resultado.AsyncState;
respuesta.Socket.EndConnect(resultado);
byte[] buffer = respuesta.Serializar();
respuesta.Socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, Send, respuesta);
} catch (SocketException) {
Console.WriteLine("\n\nServidor caído, reintentando...");
Thread.Sleep(1000);
Comenzar(puerto);
}
}
public void Send(IAsyncResult result) {
Serializador respuesta = (Serializador) result.AsyncState;
int size = respuesta.Socket.EndSend(result);
Console.WriteLine("Enviando dato: " + respuesta.claseGuardarJuego.Jugador.NombreJugador);
todoListo.Set();
}
}
Я знаю, что должен получить IP-адреса компьютеров, а затем отправить их, но я не знаю, как их применить.