簡體   English   中英

是否可以將小程序用作Java的服務器?

[英]Is it possible to use an applet as a server with Java?

我剛剛進入網絡,對於如何使用服務器托管公司的服務器進行游戲感到非常困惑。 目前,該程序允許用戶從其計算機托管服務器,並且在一定程度上可以正常工作。 唯一的問題是,當我的朋友從其他國家/地區連接到游戲時,他們的ping值非常高,並且非常落后。

我現在正在使用一個提供免費網絡托管空間的網站。 我相信我已經跳過了使用套接字所需的大多數權限限制,並且applet的運行方式與在計算機上運行時的運行方式一樣。

以下是Game類的摘錄。 如果我使用InetAddress.getLocalHost()。getHostAddress()來獲取IP,它將從使用客戶端的用戶那里獲取IP,並將其作為服務器主機。 這行得通,但是並不能解決我的滯后問題。

    Game.java

    public synchronized void start() {
    running = true;

    thread = new Thread(this, NAME + "_main");
    thread.start();

    if (JOptionPane.showConfirmDialog(this, "Do you want to run the server") == 0) {
        socketServer = new GameServer(this);
        socketServer.start();
    }


    this.ipAddress = "31.170.163.198";
    //this.ipAddress = InetAddress.getByName(ipAddress).toString();

    System.out.println("IP: " + this.ipAddress);
    socketClient = new GameClient(this, this.ipAddress);//Inet4Address.getLocalHost().getHostAddress());    

    try {
        Player.setIp(Inet4Address.getLocalHost().getHostAddress());
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }
    socketClient.start();
}

我希望包含jar的服務器托管該服務器。 我們所有人都相互ping測試,並且大多數人都超時了,但是,當我們ping服務器的ip時,我們都得到了不錯的ping。 當我手動輸入服務器的IP(在控制面板中找到此信息)時,服務器/客戶端無法建立連接。 我嘗試使用提供的網站IP和服務器IP。 我還嘗試使用applet.getCodeBase()。getHost()以便從服務器檢索IP,但是該IP也無法發送/接收數據。

我想做的事可能嗎? 服務器是否阻止了我以這種方式使用它? 我是否需要重寫整個程序並查看java servlet以實現我的目標?

我很抱歉這個問題很愚蠢。 在過去的3-4天中,我一直在為此工作,但進展甚微。 我已經以這種方式使用服務器進行了一些搜索,但在該主題上我發現得很少。

以下是其他相關代碼段的摘錄。

GameClient.java

package fraccas.java2dgame.net;


public class GameClient extends Thread {

private InetAddress ipAddress;
private DatagramSocket socket;
private Game game;
public long lastPing = 0;
public static int ping = 0;

public GameClient(Game game, String ipAddress) {
    this.game = game;
    try {
        this.socket = new DatagramSocket();
        this.ipAddress = InetAddress.getByName(ipAddress);
        System.out.println("IP: " + InetAddress.getByName(ipAddress));
    } catch (SocketException e) {
        e.printStackTrace();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }
}

public void run() {
    while (true) {
        byte[] data = new byte[1024];
        DatagramPacket packet = new DatagramPacket(data, data.length);
        try {
            socket.receive(packet);
            if (packet != null)
            {
                long current = System.currentTimeMillis();
                ping = (int) (current - lastPing);
                lastPing = current;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        this.parsePacket(packet.getData(), packet.getAddress(), packet.getPort());
    }
}

private void parsePacket(byte[] data, InetAddress address, int port) {
    String message = new String(data).trim();
    PacketTypes type = Packet.lookupPacket(message.substring(0, 2));
    Packet packet = null;
    switch (type) {
    default:
    case INVALID:
        break;
    case LOGIN:
        packet = new Packet00Login(data);
        handleLogin((Packet00Login) packet, address, port);
        break;
    case DISCONNECT:
        packet = new Packet01Disconnect(data);
        System.out.println("[" + address.getHostAddress() + ":" + port + "] "
                + ((Packet01Disconnect) packet).getUsername() + " has left the world...");
        game.level.removePlayerMP(((Packet01Disconnect) packet).getUsername());
        break;
    case MOVE:
        packet = new Packet02Move(data);
        handleMove((Packet02Move) packet);
    }
}

public void sendData(byte[] data) {
    //if (!game.isApplet) {
        DatagramPacket packet = new DatagramPacket(data, data.length, ipAddress, 3333);
        try {
            socket.send(packet);
        } catch (IOException e) {
            e.printStackTrace();
        }
   //}
}

private void handleLogin(Packet00Login packet, InetAddress address, int port) {
    System.out.println("[" + address.getHostAddress() + ":" + port + "] " + packet.getUsername()
            + " has joined the game...");
    PlayerMP player = new PlayerMP(game.level, packet.getX(), packet.getY(), packet.getUsername(), address, port);
    game.level.addEntity(player);
}

private void handleMove(Packet02Move packet) {
    this.game.level.movePlayer(packet.getUsername(), packet.getX(), packet.getY(), packet.getNumSteps(),
            packet.isMoving(), packet.getMovingDir());
}

}

GameServer.java

package fraccas.java2dgame.net;


public class GameServer extends Thread {

private DatagramSocket socket;
private Game game;
private List<PlayerMP> connectedPlayers = new ArrayList<PlayerMP>();

public GameServer(Game game) {
    this.game = game;
    try {
        this.socket = new DatagramSocket(3333);
    } catch (SocketException e) {
        e.printStackTrace();
    }
}

public void run() {
    while (true) {
        byte[] data = new byte[1024];
        DatagramPacket packet = new DatagramPacket(data, data.length);
        try {
            socket.receive(packet);
        } catch (IOException e) {
            e.printStackTrace();
        }
        this.parsePacket(packet.getData(), packet.getAddress(), packet.getPort());
    }
}

private void parsePacket(byte[] data, InetAddress address, int port) {
    String message = new String(data).trim();
    PacketTypes type = Packet.lookupPacket(message.substring(0, 2));
    Packet packet = null;
    switch (type) {
    default:
    case INVALID:
        break;
    case LOGIN:
        packet = new Packet00Login(data);
        System.out.println("[" + address.getHostAddress() + ":" + port + "] "
                + ((Packet00Login) packet).getUsername() + " has connected...");
        PlayerMP player = new PlayerMP(game.level, 100, 100, ((Packet00Login) packet).getUsername(), address, port);
        this.addConnection(player, (Packet00Login) packet);
        break;
    case DISCONNECT:
        packet = new Packet01Disconnect(data);
        System.out.println("[" + address.getHostAddress() + ":" + port + "] "
                + ((Packet01Disconnect) packet).getUsername() + " has left...");
        this.removeConnection((Packet01Disconnect) packet);
        break;
    case MOVE:
        packet = new Packet02Move(data);
        this.handleMove(((Packet02Move) packet));
    }
}

public void addConnection(PlayerMP player, Packet00Login packet) {
    boolean alreadyConnected = false;
    for (PlayerMP p : this.connectedPlayers) {
        if (player.getUsername().equalsIgnoreCase(p.getUsername())) {
            if (p.ipAddress == null) {
                p.ipAddress = player.ipAddress;
            }
            if (p.port == -1) {
                p.port = player.port;
            }
            alreadyConnected = true;
        } else {
            // relay to the current connected player that there is a new
            // player
            sendData(packet.getData(), p.ipAddress, p.port);

            // relay to the new player that the currently connect player
            // exists
            //packet = new Packet00Login(p.getUsername(), p.x, p.y);
            Packet00Login packetNew = new Packet00Login(p.getUsername(), p.x, p.y);
            sendData(packetNew.getData(), player.ipAddress, player.port);
        }
    }
    if (!alreadyConnected) {
        this.connectedPlayers.add(player);
    }
}

public void removeConnection(Packet01Disconnect packet) {
    this.connectedPlayers.remove(getPlayerMPIndex(packet.getUsername()));
    packet.writeData(this);
}

public PlayerMP getPlayerMP(String username) {
    for (PlayerMP player : this.connectedPlayers) {
        if (player.getUsername().equals(username)) {
            return player;
        }
    }
    return null;
}

public int getPlayerMPIndex(String username) {
    int index = 0;
    for (PlayerMP player : this.connectedPlayers) {
        if (player.getUsername().equals(username)) {
            break;
        }
        index++;
    }
    return index;
}

public void sendData(byte[] data, InetAddress ipAddress, int port) {
    //if (!game.isApplet) {

        DatagramPacket packet = new DatagramPacket(data, data.length, ipAddress, port);
        try {
            this.socket.send(packet);
        } catch (IOException e) {
            e.printStackTrace();
        }
    //}
}

public void sendDataToAllClients(byte[] data) {
    for (PlayerMP p : connectedPlayers) {
        sendData(data, p.ipAddress, p.port);
    }
}

private void handleMove(Packet02Move packet) {
    if (getPlayerMP(packet.getUsername()) != null) {
        int index = getPlayerMPIndex(packet.getUsername());
        PlayerMP player = this.connectedPlayers.get(index);
        player.x = packet.getX();
        player.y = packet.getY();
        player.setMoving(packet.isMoving());
        player.setMovingDir(packet.getMovingDir());
        player.setNumSteps(packet.getNumSteps());
        packet.writeData(this);
    }
}

該小程序目前在控制台中沒有任何錯誤。 它只是不發送/接收數據。

http://critterisland.bugs3.com/public_html/index.html(Applet鏈接) http://gyazo.com/a91401545b1a741f2b9fc86471bd5762 (Applet的圖片)

感謝您的時間,Fraccas

問題是您使用的是Web主機,該主機只能向用戶提供文件,而不是實際能夠運行您創建的軟件。

要以所需的方式獨立運行軟件,最簡單的選擇是租用適合用戶的虛擬專用服務器(VPS)。 但是,您將需要能夠在VPS上進行一些基本配置(例如安裝Java),然后將服務器作為控制台應用程序運行。

無需更改太多代碼即可使其工作。 通過添加僅啟動服務器的命令行參數(即“ -server”),可以為服務器和客戶端使用相同的jar文件。 然后,從服務器計算機/ VPS運行“ java -jar CritterIslandTest.jar -server”啟動服務器,然后僅啟動服務器並處理通信。 如果找不到命令行參數,則可以繼續使用GUI邏輯。

暫無
暫無

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

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