UDP,DatagramPacket仅在两台计算机之间的某个方向上接收

时间:2014-07-20 09:54:30

标签: java udp

我正在编写战舰游戏,使用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());
        }
    }

2 个答案:

答案 0 :(得分:1)

您需要在整个过程中保持套接字打开,而不是在您认为自己准备接收时打开套接字。否则,如果数据已经发送,它将丢失。您也可以使用相同的发送方式。

答案 1 :(得分:0)

好的,感谢您的支持,我刚刚解决了这个问题。代码还可以,但我在两台计算机上都使用相同的IP,因此信息只能朝着一个方向发展。例如: ComputerA有192.168.1.10 ComputerB有192.168.1.20 当我在computerA中运行游戏时,我必须编写ComputerB的IP 当我在computerB中运行时,我必须编写ComputerA的IP 端口还可以。 @David Schwartz我已经知道为什么我使用两个端口了。游戏必须同时是客户端和服务器,所以它必须有两个端口。