- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写战舰游戏,以便使用 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/
在这个例子中,我使用的是 flex-direction:row http://jsfiddle.net/9a1d2ddz/ 当空间不足以容纳元素时,出现垂直滚动条 我想达到同样的效果,但采用“从上到下
我是一名优秀的程序员,十分优秀!