2012-01-27 34 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)); 
    } 
} 

..和客户端的代码:

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 = dane.getBytes("ASCII") 

要覆盖原声明:

wejscie = new byte[1024]; 

与未知大小的一些字节数组。但是,然后你清除缓冲区:

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

与固定大小。它应该是:

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

存在了没有错误!谢谢你的建议。 – 2012-01-27 18:44:09

2

读取数据包时,你需要使用信息的接收长度(DatagramPacket.getLength())而不是您创建的字节数组的长度。

1

wyslijDanewejscie"ready!".getBytes(),但czyscBuforWejscia预计其规模为1024