2017-01-24 16 views
0

Ниже код отправителя/получателя пытается передать файл изображения (49692 байта) с клиента на сервер (использует сокет UDP). Хотя размер bytearray в точности равен байтовому буферу, я был брошен исключение (указанное в строке № 30 на стороне приемника). Любая помощь?не может решить проблему BufferOverflow Exception - Java

Sender Side:

public class P_Sender 
{ 
    public static DatagramSocket sock =null; 
    public static DatagramPacket sendPacket,recvPacket=null; 
    public static int port=15000; 
    public static InetAddress ip; 
    public static ByteBuffer fileBuffer; 
    public static byte[] sendBytes; 

    public static byte[] int2Byte(int i) throws IOException 
    { 
    ByteArrayOutputStream baos=new ByteArrayOutputStream(Integer.SIZE/4); 
    DataOutputStream dos=new DataOutputStream(baos); 
    dos.writeInt(i); 
    byte[] result=baos.toByteArray(); 
    dos.close();  
    return result; 
    } 

    public static void main(String[] args) throws Exception 
    { 
     FileChannel inChannel = new FileInputStream("abc.jpeg").getChannel(); 
     fileBuffer = ByteBuffer.allocate((int) inChannel.size()); 
     inChannel.read(fileBuffer); 
     inChannel.close(); 
     fileBuffer.flip(); 
     ip=InetAddress.getByName("localhost"); 
     sock=new DatagramSocket(); 
     sendBytes=new byte[fileBuffer.capacity()]; 
     System.out.println("Length:" +fileBuffer.capacity()); 
     fileBuffer.get(sendBytes); 
     sendPacket=new DatagramPacket(sendBytes,sendBytes.length,ip,port); 
     sock.send(sendPacket); 
     System.out.println("sent Packet Length:" +sendPacket.getLength()); 
    } 

} 

Receiver Side:

public class P_Recv 
{ 
    public static DatagramSocket sock; 
    public static DatagramPacket recvDataPacket; 
    public static byte[] recvBytes; 
    public static int port; 
    byte[] dataBuf; 
    public static InetAddress ip; 
    public static ByteBuffer fileBuffer; 

    public static void main(String args[]) throws Exception 
    { 
     SrReceiver srobj=new SrReceiver(); 
     sock=new DatagramSocket(15000); 
     recvBytes=new byte[49692]; 
     recvDataPacket=new DatagramPacket(recvBytes,recvBytes.length); 
     sock.receive(recvDataPacket); 
     System.out.println("Received Packet Length: "+recvDataPacket.getLength()); 
     fileBuffer= ByteBuffer.allocate(recvDataPacket.getLength()); 
     System.out.println(fileBuffer.capacity()); 
     fileBuffer.clear(); 
     fileBuffer.flip(); 
     fileBuffer.put(recvBytes);//Here i am thrown BufferOverflowException 
     FileChannel outchannel = new FileOutputStream(new File("abcd.jpeg")).getChannel(); 
     outchannel.write(fileBuffer); 
     outchannel.close(); 
     sock.close(); 
    }//main 
}//class 
+0

'Integer.SIZE/4'? – Kayaman

+0

Вы уверены, что recvDataPacket это размер? Вы не проверяете его и используете для выделения буфера, а затем пишете больше. –

+0

Я проверил его со стороны отправителя и, следовательно, жестко закодировал его. я уверен, что 49692 был перенесен на сторону приемника (я тоже мог бы его распечатать). –

ответ

1

Перемещение flip() к после put(). Он используется только до write() или любого аромата get(). Он не используется до read() или любого аромата put().

+0

Вы также можете избавиться от 'clear()'. Совершенно новый буфер уже понятен. – EJP

+0

Удалено флип(). Это сработало, спасибо. –

+0

Нет, если вы не вернете его перед записью. – EJP