2014-11-26 1 views
0

Я просто вхожу в сеть, и я довольно смущен тем, как я могу использовать сервер от серверной хостинговой компании для игры. На данный момент программа позволяет пользователю размещать сервер со своего компьютера, и это работает в некоторой степени. Единственная проблема заключается в том, что когда мои друзья подключаются к игре из других штатов, их пинг очень высок, и они ужасно падают.Можно ли использовать апплет как сервер с Java?

Я сейчас использую сайт, который выдает бесплатное пространство для веб-хостинга. Я считаю, что я перепрыгнул через большинство разрешений, которые мне нужны, чтобы использовать сокеты, и апплет работает так же, как и во время работы на моем компьютере.

Ниже приведена выдержка из класса игры. Если я использую 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(); 
} 

Я хочу, чтобы сервер, содержащий банку, размещал сервер. Мы все ping проверяем друг друга, и мы, в основном, все время выходим, однако, когда мы пинги ip сервера, мы все получаем приличный пинг. Когда я ввожу IP-адрес сервера (я нахожу эту информацию на панели управления) вручную, сервер/клиент не может установить соединение. Я попытался использовать как IP-адрес веб-сайта, так и IP-адрес сервера. Я также попытался использовать applet.getCodeBase(). GetHost(), чтобы получить IP-адрес с сервера, но этот IP не смог отправить и получить данные.

Является ли то, что я пытаюсь сделать возможным? Является ли сервер блокирующим меня таким образом? Нужно ли переписывать всю программу и просматривать сервлеты Java для достижения моей цели?

Приносим извинения, если вопрос глупо. Я работаю над этим в течение последних 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 Link) http://gyazo.com/a91401545b1a741f2b9fc86471bd5762 (Изображение апплета)

Спасибо за вас время, Fraccas

ответ

0

Проблема заключается в том, что вы используете веб-хостинг, который может предоставить только файлы для пользователей, в отличие от фактического возможности запуска созданного вами программного обеспечения.

Чтобы запустить ваше программное обеспечение независимо от того, как вы хотите, ваш самый простой вариант - арендовать виртуальный частный сервер (VPS), который правильно расположен для ваших пользователей. Однако вам нужно будет выполнить некоторую базовую конфигурацию на VPS (например, установить Java), а затем запустить свой сервер в качестве консольного приложения.

Не нужно менять код, чтобы заставить его работать. Вы можете использовать один и тот же файл jar как для сервера, так и для клиента, добавив аргумент командной строки, который запускает только сервер (т. Е. «Сервер»). На серверном компьютере/VPS вы запустили сервер, запустив «java -jar CritterIslandTest.jar-server», который затем запускает сервер и обрабатывает связь.Если аргумент командной строки не найден, вы можете продолжить логику GUI.

+0

Если бы я решил арендовать VPS, у меня был бы код? Или мне нужно будет много перекодировки? (например, преобразование в сервлет?) – Fraccas

+0

Я добавил абзац о изменениях кода в ответ. – zcj

+0

Awesome. Спасибо за помощь. – Fraccas

Смежные вопросы