2012-01-27 2 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 = new byte[1024]; 

크기를 알 수없는 몇 가지 바이트 배열. 그런 다음 버퍼를 지우십시오.

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

고정 크기입니다. wejscie"ready!".getBytes()

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

될 것으로 예상 : 그것은 있었어야! 덕분에 조언. –

2

패킷을 읽을 때, 수신 한 데이터의 길이 (DatagramPacket.getLength())를 사용합니다, 생성 한 바이트 배열의 길이가 아닙니다. 원래 선언을 덮어 쓰는

wejscie = dane.getBytes("ASCII") 

:

1

wyslijDane 설정하지만 czyscBuforWejscia는 크기가 오류가 더 이상 없습니다 1024

관련 문제