2012-01-27 15 views
0

私は自分のプログラムで使用した変数/関数の名前を磨くために、最初から謝罪する必要があります。DatagramPacketベースのアプリケーションのArrayIndexOutOfBoundsException

ので、少し辞書があります:クライアントがサーバーからデータを受信して​​いるとき

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

問題は、一瞬である - 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) 

サーバ全体のコード:

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)); 
    } 
} 

..andクライアントのコード:

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)); 
    } 
} 

答えて

4

私はここにいることを推測:不明サイズのいくつかのバイト配列で

wejscie = new byte[1024]; 

wejscie = dane.getBytes("ASCII") 

あなたは、元の宣言を上書きしています。しかし、バッファをクリアする:

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

固定サイズです。

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

ことを期待:それはされている必要があります!アドバイスをありがとう。 –

2

パケットを読み込むときに、あなたが受信したデータの長さ(DatagramPacket.getLength())を使用する必要があり、あなたが作成したバイト配列の長さではありません。

1

wyslijDaneセット"ready!".getBytes()からwejscieが、czyscBuforWejsciaはエラーはもうありません、そのサイズが1024

関連する問題