gpt4 book ai didi

java - UDP、DatagramPacket 仅在两台计算机之间的一个方向上接收

转载 作者:行者123 更新时间:2023-12-01 12:44:01 27 4
gpt4 key购买 nike

我正在编写战舰游戏,以便使用 UDP 在同一网络中的两台计算机之间进行游戏。当我做出连接时,它不会引发期望,但信息只会朝着一个方向发展。我的意思是,计算机 A 正确地将坐标发送到计算机 B,但计算机 B 没有将坐标发送到计算机 A。两台计算机的代码相同,所以我不明白错误在哪里。 ComputerA 始终停止在 recibeBarcos.recibe(...) 方法中。为了建立连接,我使用计算机的 IP (192.168.1.128) 和端口 5000 和 5002

重要提示:如果我使用 IP 本地主机在同一台计算机上运行游戏,则它可以正常工作。

我翻译了一些变量,以便您可以更好地理解代码:Envia - 发送类tamanioMensaje - 消息长度常量Recibe - 接收类paquete - 数据包portaaviones - 最大的船毁灭者和潜艇 - 中型船lancha1 & lancha2 - 小船cadenaBarcosAEnviar - 要发送的船舶坐标cadenaBarcosARecibir - 要接收的船舶坐标getPuertoOrigen() - 返回原始端口getPuertoDestino() - 返回目标端口这些是基础类(class)。

public class Envia extends Object
{
public void envia(String mensaje, int tamanioMensaje, String hostDestino, int puerto) {
try {
DatagramSocket miSocket = new DatagramSocket();
byte[] buffer = new byte[tamanioMensaje];
DatagramPacket paquete;
buffer = mensaje.getBytes();
paquete = new DatagramPacket(buffer, mensaje.length(), InetAddress.getByName(hostDestino), puerto);
miSocket.send(paquete);
miSocket.close();
} catch (Exception exc) {
System.out.println("Error: " + exc);
}
}
}



public class Recibe extends Object
{
DatagramSocket miSocket;
DatagramPacket paquete;
byte[] buffer;

public String recibe(int Puerto, int TamanioMaximoMensaje) {
try{
miSocket = new DatagramSocket(Puerto);
buffer = new byte[TamanioMaximoMensaje];
paquete = new DatagramPacket(buffer, buffer.length);
miSocket.receive(paquete);
miSocket.close();
} catch (Exception e) {
System.out.println("Error: " + e);
}

return new String(paquete.getData()).substring(0, paquete.getLength());
}
}

public void realizarConexion()
{
this.portaavionesCoordsOponente=new String[4];
this.destructorCoordsOponente=new String[3];
this.submarinoCoordsOponente=new String[2];
this.lancha1CoordsOponente=new String[1];
this.lancha2CoordsOponente=new String[1];

this.iRecibeBarcos=new Recibe();
this.iEnviaBarcos=new Envia();

RecibirBarcos iRecibirBarcos=new RecibirBarcos();
EnviarBarcos iEnviarBarcos=new EnviarBarcos();

iRecibirBarcos.start();
iEnviarBarcos.start();

}

private class RecibirBarcos extends Thread
{
public void run()
{
cadenaBarcosARecibir=iRecibeBarcos.recibe(conexion.getPuertoOrigen(), tamanyoMensaje);



asignarDatosRecibidosACoordenadasBarcos();

colocarBarcosEnPanel();

iEnviaAtaque=new Envia();
iRecibeAtaque=new Recibe();

RecibirAtaque iRecibirAtaque=new RecibirAtaque();
EnviarAtaque iEnviarAtaque=new EnviarAtaque();

iRecibirAtaque.start();
iEnviarAtaque.start();
}
}

private class EnviarBarcos extends Thread
{
public void run()
{
JOptionPane.showConfirmDialog(null, "Espera a que tu oponente esté en esta misma pantalla para empezar a jugar.", "Espera", JOptionPane.WARNING_MESSAGE);

String cadenaBarcosAEnviar;
cadenaBarcosAEnviar=colocarBarcosMultijugador.getPortaavionesJugador()[0] + "-"
+ colocarBarcosMultijugador.getPortaavionesJugador()[1] + "-"
+ colocarBarcosMultijugador.getPortaavionesJugador()[2] + "-"
+ colocarBarcosMultijugador.getPortaavionesJugador()[3] + "-"
+ colocarBarcosMultijugador.getDestructorJugador()[0] + "-"
+ colocarBarcosMultijugador.getDestructorJugador()[1] + "-"
+ colocarBarcosMultijugador.getDestructorJugador()[2] + "-"
+ colocarBarcosMultijugador.getSubmarinoJugador()[0] + "-"
+ colocarBarcosMultijugador.getSubmarinoJugador()[1] + "-"
+ colocarBarcosMultijugador.getLancha1Jugador()[0] + "-"
+ colocarBarcosMultijugador.getLancha2Jugador()[0];

iEnviaBarcos.envia(cadenaBarcosAEnviar, cadenaBarcosAEnviar.length(), conexion.getIP(), conexion.getPuertoDestino());
}
}

最佳答案

您需要在进程的生命周期中保持套接字打开,而不是在您认为准备好接收时才打开它。否则,如果数据已经发送,它将丢失。您也可以使用同一个来发送。

关于java - UDP、DatagramPacket 仅在两台计算机之间的一个方向上接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24849315/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com