问题:只能在网络中传输小于10KB的图片,问如何可用最简便的方法把缓冲区设更大些。
相关代码:
private InputStream is;
byte[] bs = new byte[1024 * 1024];//缓冲区最大只能设1024*1024*10
is.read(bs);
readPacket = new QQPacket(bs);
//以下为QQPacket包的相关代码
private int type; private String from, to; private HashMap content;
/**
 * 解包
 */
public QQPacket(byte[] bs) {
ByteArrayInputStream bais = new ByteArrayInputStream(bs);
ObjectInputStream ois;
try {
ois = new ObjectInputStream(bais); this.type = ois.readInt();
this.from = ois.readUTF();
this.to = ois.readUTF();
this.content = (HashMap) ois.readObject();
} catch (IOException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
/**
 * 将字段转换成字节数组,即打包
 * 
 * @return
 */
public byte[] toByteArray() {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos; try {
oos = new ObjectOutputStream(baos);
oos.writeInt(type);
oos.writeUTF(from);
oos.writeUTF(to);
oos.writeObject(content); } catch (IOException e) {
e.printStackTrace();
}
return baos.toByteArray();
}
//总体是利用TCP传输的。服务器报警:java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2232)
at java.io.ObjectInputStream$BlockDataInputStream.readInts(ObjectInputStream.java:2853)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1607)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1293)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
at javax.swing.ImageIcon.readObject(ImageIcon.java:393)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:919)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1813)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
at java.util.ArrayList.readObject(ArrayList.java:592)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:919)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1813)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
at java.util.HashMap.readObject(HashMap.java:1013)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:919)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1813)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
at com.zw.pubutil.QQPacket.<init>(QQPacket.java:50)
at com.zw.server.thread.SeverChatThread.run(SeverChatThread.java:62)
java.io.StreamCorruptedException: invalid stream header
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:753)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:268)
at com.zw.pubutil.QQPacket.<init>(QQPacket.java:45)
at com.zw.server.thread.SeverChatThread.run(SeverChatThread.java:62)
java.io.StreamCorruptedException: invalid stream header
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:753)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:268)
at com.zw.pubutil.QQPacket.<init>(QQPacket.java:45)
at com.zw.server.thread.SeverChatThread.run(SeverChatThread.java:62)
java.io.StreamCorruptedException: invalid stream header
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:753)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:268)
at com.zw.pubutil.QQPacket.<init>(QQPacket.java:45)
at com.zw.server.thread.SeverChatThread.run(SeverChatThread.java:62)
java.io.StreamCorruptedException: invalid stream header
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:753)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:268)
at com.zw.pubutil.QQPacket.<init>(QQPacket.java:45)
at com.zw.server.thread.SeverChatThread.run(SeverChatThread.java:62)
java.io.StreamCorruptedException: invalid stream header
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:753)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:268)
at com.zw.pubutil.QQPacket.<init>(QQPacket.java:45)
at com.zw.server.thread.SeverChatThread.run(SeverChatThread.java:62)
java.io.StreamCorruptedException: invalid stream header
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:753)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:268)
at com.zw.pubutil.QQPacket.<init>(QQPacket.java:45)
at com.zw.server.thread.SeverChatThread.run(SeverChatThread.java:62)客户端报警:
Exception in thread "Thread-2" java.lang.NullPointerException
at com.zw.client.thread.ClientChatThread.doDataPacket(ClientChatThread.java:107)
at com.zw.client.thread.ClientChatThread.run(ClientChatThread.java:95)

解决方案 »

  1.   

    貌似lz在缓冲区中放整个图片,改用循环喵~~`可以使用FileOutputStream或者专门的ImageOutputStream类来处理喵~~`
      

  2.   

    汗 哪里来这么大的缓冲区。还叫缓冲区吗
    byte[] data = new byte[1024];
    int leftDataSize = //预接收的数据量;
    int iRead; 
    StringBuilder sb = new StringBuilder(); offset = 0;
    do{
    iRead = in.read(data); String strData = new String(data,0,iRead);
    sb.append(strData);

    leftDataSize -= iRead;
    }while(leftDataSize > 0);System.out.println(sb);
      

  3.   


    1、TCP传输是字节流,发送不需要循环,直接发送即可
    2、TCP传输的字节流在传输过程中顺序不会改变,所以你要按发包的顺序进行解包一般来说,实际应用中,发包解包都有固定的格式
      

  4.   

    TCP传输一般都会使用一种固定的包格式,也就是俗话说的TCP协议
    每次传输具体数据的时候,会在这之前首先传送一个固定大小的块,这个叫做包头
    比如说 我要传输一个字符串 String s = "abcde";
    我会首先约定服务器和客户端,首先传送的4个字节表示的是具体传送数据的大小,然后才是开始传送具体数据就是发送数据格式如下:
    date[0] = 0;
    date[1] = 0;
    date[2] = 0;
    date[3] = 5;          //前4字节构成一个包头,表示需要传输的具体内容大小
    date[4~8] = "abcde"   //假想示例传送的数据接收数据时,首先接收头4个字节
    byte[] header = new byte[4];
    inputStream.read(header);
    然后我会把header转换成int,这里header转换出来就是5
    把5 赋值给leftDataSize 
    然后就开始接收具体的数据,接收到leftDataSize 为止,中止这一个读写行为这样就构成一个简单的TCP读写循环刚开始学SOCKET的时候,一般书上都是直接传送数据,而不会去教人考虑数据大小的问题
    害人啊....
    我觉得学SOCKET的话,还是起点高一点,从包的结构来学起比较好