我正在编写战舰游戏,使用UDP在同一网络中的两台计算机之间进行游戏。当我进行连接时,它不会抛出预期,但信息只会向一个方向发展。我的意思是,computerA正确地向计算机B发送坐标,但是计算机B不向计算机A发送坐标。两台计算机的代码相同,所以我不明白错误在哪里。 ComputerA总是停在recibeBarcos.recibe(...)方法中。 为了建立连接,我使用计算机的IP(192.168.1.128)和端口5000& 5002
重要提示:如果我使用IP localhost在同一台计算机上运行游戏,它可以正常工作。
我翻译了一些变量,以便您更好地理解代码: Envia - 发送课程 tamanioMensaje - 消息长度常数 Recibe - 接收课程 paquete - 包 portaaviones - 最大的船 析构者& submarino - 中型船 兰查1& lancha2 - 小船 cadenaBarcosAEnviar - 要发送的船舶坐标 cadenaBarcosARecibir - 要接收的船舶坐标 getPuertoOrigen() - 返回原始端口 getPuertoDestino() - 返回目标端口 这些是基础课。
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());
}
}
答案 0 :(得分:1)
您需要在整个过程中保持套接字打开,而不是在您认为自己准备接收时打开套接字。否则,如果数据已经发送,它将丢失。您也可以使用相同的发送方式。
答案 1 :(得分:0)
好的,感谢您的支持,我刚刚解决了这个问题。代码还可以,但我在两台计算机上都使用相同的IP,因此信息只能朝着一个方向发展。例如: ComputerA有192.168.1.10 ComputerB有192.168.1.20 当我在computerA中运行游戏时,我必须编写ComputerB的IP 当我在computerB中运行时,我必须编写ComputerA的IP 端口还可以。 @David Schwartz我已经知道为什么我使用两个端口了。游戏必须同时是客户端和服务器,所以它必须有两个端口。