调用了finish(),后ZIPStream就算设置了结束位
看看下面的传文件的例子,我随手写的,可能编译有问题,但大体是这样用的:
==========Server:
int ret=0;
byte[] tmpdata=new byte[4096];
byte[] data;
FileInputStream in=new FileInputStream("Test.txt");
Socket client=server.accept();
BufferedOutputStream out=new BufferedOutputStream(new GZIPOutputStream(client.getOutputStream()));
do{
ret=in.read(tmpdata);
System.out.println(ret);
if(ret==-1) break;
data=new byte[ret];
System.arraycopy(tmpdata, 0, data, 0, ret);
out.write(data);
out.flush();
}while(true);
in.close();
out.close();==========Client:
int ret;
byte[] tmpdata=new byte[4096];
byte[] data;
Socket c=new Socket("heifei", 5050);
InputStream in=c.getInputStream();
FileOutputStream f=new FileOutputStream("Test2.gz");
do{
ret=in.read(tmpdata);
if(ret==-1)break;
data=new byte[ret];
System.arraycopy(tmpdata, 0, data, 0, ret);
f.write(data);
f.flush();
}while(true);
f.close();
in.close();
c.close();
看看下面的传文件的例子,我随手写的,可能编译有问题,但大体是这样用的:
==========Server:
int ret=0;
byte[] tmpdata=new byte[4096];
byte[] data;
FileInputStream in=new FileInputStream("Test.txt");
Socket client=server.accept();
BufferedOutputStream out=new BufferedOutputStream(new GZIPOutputStream(client.getOutputStream()));
do{
ret=in.read(tmpdata);
System.out.println(ret);
if(ret==-1) break;
data=new byte[ret];
System.arraycopy(tmpdata, 0, data, 0, ret);
out.write(data);
out.flush();
}while(true);
in.close();
out.close();==========Client:
int ret;
byte[] tmpdata=new byte[4096];
byte[] data;
Socket c=new Socket("heifei", 5050);
InputStream in=c.getInputStream();
FileOutputStream f=new FileOutputStream("Test2.gz");
do{
ret=in.read(tmpdata);
if(ret==-1)break;
data=new byte[ret];
System.arraycopy(tmpdata, 0, data, 0, ret);
f.write(data);
f.flush();
}while(true);
f.close();
in.close();
c.close();
xml一是数据的定义比较困难,二是需要解析有可能速度较慢
to:heifei()
我使用更你一样的流包装方式,只调用flush,但不调用finish,数据不发送,在CLIENT端aviable测试为0
void jButton1_actionPerformed(ActionEvent e) {
Socket dataSocket = null;
DataOutputStream outStream = null;
GZIPOutputStream zipOut = null;
DataInputStream inStream = null;
try{
dataSocket = new Socket("127.0.0.1",2003);
zipOut = new GZIPOutputStream(dataSocket.getOutputStream());
outStream = new DataOutputStream(new BufferedOutputStream(zipOut));
inStream = new DataInputStream(new BufferedInputStream(dataSocket.getInputStream())); outStream.writeInt(10);
outStream.flush(); inStream.readInt(); outStream.writeInt(100);
outStream.flush();
}catch(IOException ex){
ex.printStackTrace();
}finally{
try{
if(outStream != null)outStream.close();
if(inStream != null)inStream.close();
if(dataSocket != null)dataSocket.close();
}catch(IOException ex){ex.printStackTrace();}
}
} void jButton2_actionPerformed(ActionEvent e) {
ServerSocket serverSocket = null;
Socket dataSocket = null;
DataOutputStream outStream = null;
DataInputStream inStream = null;
try{
serverSocket = new ServerSocket(2003);
dataSocket = serverSocket.accept(); outStream = new DataOutputStream(new BufferedOutputStream(dataSocket.getOutputStream()));
inStream = new DataInputStream(new BufferedInputStream(new GZIPInputStream(dataSocket.getInputStream()))); int rec = inStream.readInt();
System.out.println("rec1 = "+rec);
outStream.writeInt(10);
outStream.flush(); rec = inStream.readInt();
System.out.println("rec2 = "+rec); }catch(IOException ex){
ex.printStackTrace();
}finally{
try{
if(outStream != null)outStream.close();
if(inStream != null)inStream.close();
if(dataSocket != null)dataSocket.close();
if(serverSocket != null)serverSocket.close();
}catch(IOException ex){ex.printStackTrace();}
}
}请帮忙看看,多谢!
write(aByte);
flush();
...
相当于对单字节压缩,把client端和server端的
zipOut = new GZIPOutputStream(..)和new GZIPInputStream(..)
去掉就能正常运行,
压缩流还是应该用来压缩大数据量的byte[]数据块,单字节谈不上压缩的。
byte b[] = new byte[204800];
int j = 1;
for(int i=0;i<204800;i++){
b[i] = (byte)j;
j++;
if(j>125)j=0;
}
假如通了,就以前的代码,好象要出异常。
是不是GZIP流不能双工操作?
(heifei),有空麻烦试试,你那段代码好象也差不多
=========Client
Socket dataSocket = null;
DataOutputStream outStream = null;
DataInputStream inStream = null;
byte b[] = new byte[1024];
int j = 1;
for(int i=0;i<1024;i++){
b[i] = (byte)125;
}
try{
dataSocket = new Socket("127.0.0.1",2003);
inStream = new DataInputStream(new BufferedInputStream(new GZIPInputStream(dataSocket.getInputStream())));
outStream = new DataOutputStream(new BufferedOutputStream(new GZIPOutputStream(dataSocket.getOutputStream())));
//outStream.write(b);
outStream.writeInt(100);
outStream.flush();//下面这段代码去调好用
/**************************************/
int ret = inStream.readInt();
System.out.println(ret);
/**************************************/ }catch(IOException ex){
ex.printStackTrace();
}finally{
try{
if(outStream !=null)outStream.close();
if(inStream !=null)inStream.close();
if(dataSocket !=null)dataSocket.close();
}catch(IOException ex){
}
}=============Server
ServerSocket serverSocket = null;
Socket dataSocket = null;
DataOutputStream outStream = null;
DataInputStream inStream = null;
byte b[] = new byte[1024];
try{
serverSocket = new ServerSocket(2003);
dataSocket = serverSocket.accept();
outStream = new DataOutputStream(new BufferedOutputStream(new GZIPOutputStream(dataSocket.getOutputStream())));
inStream = new DataInputStream(new BufferedInputStream(new GZIPInputStream(dataSocket.getInputStream())));
//int ret = inStream.read(b);
//System.out.println(ret);
int ret = inStream.readInt();
System.out.println(ret); outStream.writeInt(1000);
outStream.flush(); }catch(IOException ex){
ex.printStackTrace();
}finally{
try{
if(inStream != null)inStream.close();
if(outStream != null)outStream.close();
if(dataSocket != null)dataSocket.close();
if(serverSocket != null)serverSocket.close();
}catch(IOException ex){}
}
只是你在一个线程里读写,由于write()和read()方法本身是阻塞的,所以当前线程变成“单工”的了。
http://www.jguru.com/faq/view.jsp?EID=3823
client连接--服务器将文件10M的文件读入byte【】,下载到客户端-客户端解压,存盘,重新压缩后再上传
应该不麻烦的。