无法解决 BufferOverflow 异常 - Java
cannot Solve BufferOverflow Exception - Java
下面的sender/receiver代码尝试将图像文件(49692字节)从客户端传输到服务器(使用UDP套接字)。虽然字节数组的大小正好等于字节缓冲区,但我抛出了异常(在接收方的第 30 行中提到)。有什么帮助吗?
发送端:
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());
}
}
接收方:
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
将 flip()
移到 put()
之后。它仅在 write()
或 get()
的任何风格之前使用。在 read()
或 put()
.
之前不使用它
下面的sender/receiver代码尝试将图像文件(49692字节)从客户端传输到服务器(使用UDP套接字)。虽然字节数组的大小正好等于字节缓冲区,但我抛出了异常(在接收方的第 30 行中提到)。有什么帮助吗?
发送端:
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());
}
}
接收方:
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
将 flip()
移到 put()
之后。它仅在 write()
或 get()
的任何风格之前使用。在 read()
或 put()
.