簡體   English   中英

Java網絡-java.net.BindException

[英]Java networking - java.net.BindException

我正在創建一個LWJGL策略游戲,並且正在其中實現多人游戲。

現在,該游戲正在生成一個具有一些不同圖塊類型的世界。

我想我應該立即開始實施網絡,以使服務器產生世界,並且所有加入該市場的客戶都下載並加載該世界(即使游戲還不能玩),以便以后更輕松地實現更高級的東西。 現在問題了!

我正在觀看由DesignsbyZephyr制作的有關網絡實現的這些教程,但出現此錯誤:

java.net.BindException: Address already in use: Cannot bind
    at java.net.DualStackPlainDatagramSocketImpl.socketBind(Native Method)
    at java.net.DualStackPlainDatagramSocketImpl.bind0(Unknown Source)
    at java.net.AbstractPlainDatagramSocketImpl.bind(Unknown Source)
    at java.net.DatagramSocket.bind(Unknown Source)
    at java.net.DatagramSocket.<init>(Unknown Source)
    at java.net.DatagramSocket.<init>(Unknown Source)
    at java.net.DatagramSocket.<init>(Unknown Source)
    at com.tdd12.eotu.net.GameServer.<init>(GameServer.java:22)
    at com.tdd12.eotu.Game.<init>(Game.java:39)
    at com.tdd12.eotu.Game.main(Game.java:121)
Exception in thread "Thread-3" java.lang.NullPointerException
    at com.tdd12.eotu.net.GameServer.run(GameServer.java:37)

當我使用相同的端口兩次啟動游戲時。 聽起來很奇怪,不是嗎?

我不知道為什么,也許是因為我對網絡編程沒有很豐富的經驗(正如您可能已經了解的那樣)。

這是我正在使用的代碼:
(代碼放置在類和包中,因此它們的格式正確。我只是在這里沒有寫出來)

GameServer.java:

// The socket
private DatagramSocket socket;
// The main game
private Game game;

// The constructor
public GameServer(Game game) {
    // Assign variables
    this.game = game;
    try {
        this.socket = new DatagramSocket(9527);
    } catch (SocketException e) {
        e.printStackTrace();
    }
}

// Run the thread
public void run() {
    while(true) {
        // The data to include in the packet (data to send)
        byte[] data = new byte[1024];
        // The packet to send
        DatagramPacket packet = new DatagramPacket(data, data.length);
        // Recieve data from the server
        try {
            socket.receive(packet);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // Get the message
        String message = new String(packet.getData());
        // Print the message
        System.out.println("CLIENT [" + packet.getAddress().getHostAddress() + ":" + packet.getPort() + "] > " + new String(packet.getData()));
        // If the message is equal to "ping"
        if(message.trim().equalsIgnoreCase("ping")) {
            // Send back a message with the text "pong"
            sendData("pong".getBytes(), packet.getAddress(), packet.getPort());
        }
    }
}

// Send data to the server
public void sendData(byte[] data, InetAddress ipAddress, int port) {
    // Create a new packet with the inputed data
    DatagramPacket packet = new DatagramPacket(data, data.length, ipAddress, port);
    // Send the packet to the server
    try {
        socket.send(packet);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

GameClient.java:

// The IP address
private InetAddress ipAddress;
// The socket
private DatagramSocket socket;
// The main game
private Game game;

// The constructor
public GameClient(Game game, String ipAddress) {
    // Assign variables
    this.game = game;
    try {
        this.socket = new DatagramSocket();
        this.ipAddress = InetAddress.getByName(ipAddress);
    } catch (SocketException | UnknownHostException e) {
        e.printStackTrace();
    }
}

// Run the thread
public void run() {
    while(true) {
        // The data to include in the packet (data to send)
        byte[] data = new byte[1024];
        // The packet to send
        DatagramPacket packet = new DatagramPacket(data, data.length);
        // Recieve data from the server
        try {
            socket.receive(packet);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // Print the data
        System.out.println("SERVER > " + new String(packet.getData()));
    }
}

// Send data to the server
public void sendData(byte[] data) {
    // Create a new packet with the inputed data
    DatagramPacket packet = new DatagramPacket(data, data.length, ipAddress, 9527);
    // Send the packet to the server
    try {
        socket.send(packet);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

如果有人可以幫助我,我將不勝感激。 謝謝!

正如Diptopol大壩所說,

DatagramSocket.close();  

應用程序關閉前的方法解決了該問題。 感謝Diptopol大壩!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM