2012-01-27 2 views
0

Au début, je dois m'excuser pour les noms polonais des variables/fonctions que j'ai utilisées dans mon programme.ArrayIndexOutOfBoundsException dans l'application DatagramPacket

Donc, il y a peu de dictionnaire:

Klient - Client 
Serwer - Server 
wejscie - input 
wyjscie - output 
klienci - clients 
teraz - now 
teraz - text 
nawiazPolaczenie - establishConnection 
czyscBufor - clearBuffer 
odbierzDane - receiveData 
pakiet - packet 
wyslijDane - sendData 

Le problème est en moment, lorsque le client reçoit des données de serveur - il y a ArrayIndexOutOfBoundsException.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6 
    at kontrolerklient.Klient.czyscBuforWejscia(Klient.java:43) 
    at kontrolerklient.Klient.odbierzDane(Klient.java:48) 
    at kontrolerklient.Klient.nawiazPolaczenie(Klient.java:33) 
    at kontrolerklient.Klient.<init>(Klient.java:25) 
    at kontrolerklient.KontrolerKlient.main (KontrolerKlient.java:11) 
Java Result: 1 
BUILD SUCCESSFUL (total time: 3 seconds) 

code du serveur entier:

package kontrolerserwer; 

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.util.Date; 

public class Serwer 
{ 
    private DatagramSocket dgSocket; 
    private byte[] bufferIn; 
    private byte[] bufferOut; 
    private InetAddress[] klienci; 

    public Serwer() throws IOException 
    { 
     dgSocket = new DatagramSocket(9998, InetAddress.getByName("192.168.1.100")); 

     bufferIn = new byte[1024]; 
     bufferOut = new byte[1024]; 
     klienci = new InetAddress[256]; 

     dgSocket.setSoTimeout(1000); 
     wyslijDane("ready?", InetAddress.getByName("192.168.1.100")); 

     Date teraz = new Date(); 
     teraz.setTime(teraz.getTime()+10000); 

     while (teraz.after(new Date())) 
     { 

     } 
    } 

    public void wyslijDane(String tekst, InetAddress ip) throws IOException 
    { 
     bufferOut = tekst.getBytes("ASCII"); 
     dgSocket.send(new DatagramPacket(bufferOut, bufferOut.length, ip, 9999)); 
    } 
} 

..et code du client:

package kontrolerklient; 

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.net.SocketException; 
import java.net.UnknownHostException; 

class Klient 
{ 
    private DatagramSocket dgSocket; 
    private InetAddress host; 
    private byte[] wejscie; 
    private byte[] wyjscie; 

    public Klient() throws UnknownHostException, SocketException, IOException 
    { 
     wejscie = new byte[1024]; 
     wyjscie = new byte[1024]; 
     host = null; 

     dgSocket = new DatagramSocket(9999, InetAddress.getByName("192.168.1.100")); 

     nawiazPolaczenie(); 

    } 

    private void nawiazPolaczenie() throws IOException 
    { 
     while (true) 
     { 
      if (odbierzDane().equals("ready?")) 
      { 
       wyslijDane("ready!", 9998); 
      } 
     } 
    } 

    private void czyscBuforWejscia() 
    { 
     for (int i = 0; i < 1024; i++) 
      wejscie[i] = 0; 
    } 

    public String odbierzDane() throws IOException 
    { 
     czyscBuforWejscia(); 

     DatagramPacket pakiet = new DatagramPacket(wejscie, wejscie.length); 
     System.out.println(pakiet.getLength()); 
     try 
     { 
      dgSocket.receive(pakiet); 
      host = pakiet.getAddress(); 

      // getting packet's data 
      String s = new String(pakiet.getData(), 0, wejscie.length); 

      // getting packet's data length 
      int i; 
      for (i = 0; (i < 1024) && (wejscie[i] != 0); i++); 

      // returning packet's data 
      return s.substring(0, i); 
     } 
     catch (Exception e) { } 

     return ""; 
    } 

    public void wyslijDane(String dane, int port) throws IOException 
    { 
     wejscie = dane.getBytes("ASCII"); 
     dgSocket.send(new DatagramPacket(wyjscie, wyjscie.length, host, port)); 
    } 
} 

Répondre

4

Je suppose que ici:

wejscie = dane.getBytes("ASCII") 

vous écrasez la déclaration originale:

wejscie = new byte[1024]; 

avec un certain tableau d'octets de taille inconnue. Mais alors vous effacez le tampon:

for (int i = 0; i < 1024; i++) 

avec une taille fixe. Il aurait dû être:

for (int i = 0; i < wejscie.length; i++) 
+0

Il n'y a pas d'erreur plus! Merci pour les conseils. –

2

lors de la lecture du paquet, vous devez utiliser la longueur des données reçues (DatagramPacket.getLength()), pas la longueur du tableau d'octets que vous avez créé.

1

wyslijDane ensembles wejscie-"ready!".getBytes(), mais czyscBuforWejscia attend sa taille soit 1024

Questions connexes