2016-04-23 72 views
0

我有一個客戶端和服務器在項目中設置,但他們沒有連接在我的網絡上的計算機之間。UDP連接不通過lan

客戶端:

public class GameClient extends Thread { 

private static Image image; 

private InetAddress ipAddress; 
private DatagramSocket socket; 
private Play play; 

public GameClient(Play play, String ipAddress){ 
    this.play = play; 

    try { 
     this.socket = new DatagramSocket(); 
     this.ipAddress = InetAddress.getByName(ipAddress); 
    } catch (SocketException e) { 
     e.printStackTrace(); 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } 

} 

public GameClient(Play play, InetAddress ipAddress){ 
    this.play = play; 

    try { 
     this.socket = new DatagramSocket(); 
     this.ipAddress = ipAddress; 
    } catch (SocketException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

public void run() { 
    //boolean run = true; 
    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()); 
    } 
} 

public static void getImage(Image newImage){ 
    image = newImage; 
} 

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 joined the game"); 
     PlayerMP player = new PlayerMP(((Packet00Login)packet).getUsername(), (double)200, (double)200, 65, 285, (float)0, (double)1, image, address, port); 

     play.addEntity(player); 
     play.setClientPlayer(player); 
     break; 
    case DISCONNECT: 
     packet = new Packet01Disconnect(data); 
     System.out.println("[" + address.getHostAddress() + ":" + port + "] " + ((Packet01Disconnect)packet).getUsername() + " has left the world..."); 
     play.removePlayerMP(((Packet01Disconnect)packet).getUsername()); 
     break; 
    case MOVE: 
     packet = new Packet02Move(data); 
     handleMove((Packet02Move) packet); 

    } 
} 

public void sendData(byte[] data){ 
    DatagramPacket packet = new DatagramPacket(data, data.length, ipAddress, 1331); 
    try { 
     socket.send(packet); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

private void handleMove(Packet02Move packet){ 
    this.play.movePlayer(packet.getUsername(), packet.getX(), packet.getY(), packet.getDirection()); 
} 

} 

服務器:

public class GameServer extends Thread { 

private static Image image; 

private DatagramSocket socket; 
private Play play; 
private List<PlayerMP> connectedPlayers = new ArrayList<PlayerMP>(); 

public GameServer(Play play){ 
    this.play = play; 

    try { 
     this.socket = new DatagramSocket(1331); 
    } catch (SocketException e) { 
     e.printStackTrace(); 
    } 

} 

public static void getImage(Image newImage){ 
    image = newImage; 
} 

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 to the server..."); 
     PlayerMP player = new PlayerMP(((Packet00Login)packet).getUsername(), (double)200, (double)200, 65, 285, (float)0, (double)1, image, 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); 
     //System.out.println(((Packet02Move)packet).getUsername() + " has moved to " + (int)((Packet02Move)packet).getX() + " , " + (int)((Packet02Move)packet).getY()); 
     this.handleMove(((Packet02Move)packet)); 
     break; 
    } 
} 

public void addConnection(PlayerMP player, Packet00Login packet) { 
    boolean alreadyConnected = false; 
    if(!this.connectedPlayers.isEmpty()){ 
     for(PlayerMP p: this.connectedPlayers){ 
      if(player.getUsername().equalsIgnoreCase(p.getUsername())){ 
       System.out.println("Client " + player.getUsername() + " already conected as " + p.getUsername() + ": updating player information"); 
       if(p.getIpAddress() == null){ 
        p.setIpAddress(player.getIpAddress()); 
       } 
       if(p.getPort() == -1){ 
        p.setPort(player.getPort()); 
       } 
       alreadyConnected = true; 
      }else{ 
       // relay to the current connected player that there is a new 
       // player 
       sendData(packet.getData(), p.getIpAddress(), p.getPort()); 

       // relay to the new player that the currently connect player 
       // exists 

       packet = new Packet00Login(p.getUsername()); 
       System.out.println("Sending already conected player to [" + player.getIpAddress().getHostAddress() + ":" + player.getPort() + "] " + player.getUsername()); 
       sendData(packet.getData(), player.getIpAddress(), player.getPort()); 
      } 
     } 
    }else{ 
     System.out.println("Sending login to [" + player.getIpAddress().getHostAddress() + ":" + player.getPort() + "] " + player.getUsername()); 
     sendData(packet.getData(), player.getIpAddress(), player.getPort()); 
     this.connectedPlayers.add(player); 
     alreadyConnected = true; 
    } 
    if(!alreadyConnected){ 
     System.out.println("Sending login to [" + player.getIpAddress().getHostAddress() + ":" + player.getPort() + "] " + player.getUsername()); 
     packet = new Packet00Login(player.getUsername()); 
     sendData(packet.getData(), player.getIpAddress(), player.getPort()); 
     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){ 
     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) { 
    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.getIpAddress(), p.getPort()); 
    } 
} 

private void handleMove(Packet02Move packet){ 
    if(getPlayerMP(packet.getUsername()) != null){ 
     int index = getPlayerMPIndex(packet.getUsername()); 
     this.connectedPlayers.get(index).x = packet.getX(); 
     this.connectedPlayers.get(index).y = packet.getY(); 
     ((PlayerMP)this.connectedPlayers.get(index)).playerDirection = packet.getDirection(); 
     packet.writeData(this); 
    } 
} 

} 

這裏是哪裏我玩類發送第一個登錄數據包到服務器(這個包沒有被接收)

if(JOptionPane.showConfirmDialog(null, this, "do you want to start the server?", mousePosX) == 0){ 
     socketServer = new GameServer(this); 
     socketServer.start(); 
    } 
    try { 
     socketClient = new GameClient(this, InetAddress.getLocalHost()); 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } 
    socketClient.start(); 
    GameClient.getImage(standing);// these are just so that the client and the server have the image to create the player entity once they join the game 

    GameServer.getImage(standing); 
    Packet00Login loginPacket = new Packet00Login(Global.playerUsername); 
    loginPacket.writeData(socketClient); //this is where the first login is being sent, it is not being received. 

要清除程序在一臺計算機上工作localy,並且ip的外觀正確(192.0.0.XXX)但是當我選擇在一臺計算機上運行服務器而不在另一臺計算機上時,第二臺計算機無法連接到第一臺計算機。

在此先感謝!

+1

你有沒有試過禁用你的PC防火牆 –

+0

@PeterLawrey這沒有任何其他想法? – Canyonman133

+0

你如何配置你的服務器和你的客戶端? –

回答

0

想通了,wasent任何事情都做網絡工作:P原來我意外地調用服務器直接發送信息,而不是客戶端。將服務器移動到一個新項目中,並將其設置爲獨立,因爲我應該首先完成這項工作,並且所有工作都很好:)。感謝您的幫助!