问题:只能在网络中传输小于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)
相关代码:
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)
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);
1、TCP传输是字节流,发送不需要循环,直接发送即可
2、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的话,还是起点高一点,从包的结构来学起比较好