xsocket 实现上传和解压文件
引入 xsocket 相关jar
第一步:创建接受数据的类SocketHandler 
package com.socket; 
import java.io.IOException; 
import java.nio.BufferUnderflowException; 
import java.nio.channels.ClosedChannelException; 
import org.xsocket.MaxReadSizeExceededException; 
import org.xsocket.connection.IConnectExceptionHandler; 
import org.xsocket.connection.IConnectHandler; 
import org.xsocket.connection.IDataHandler; 
import org.xsocket.connection.IDisconnectHandler; 
import org.xsocket.connection.INonBlockingConnection; 
public class SocketHandler implements IConnectHandler,IDisconnectHandler,IDataHandler,IConnectExceptionHandler{
@Override 
public boolean onDisconnect(INonBlockingConnection nbc) throws IOException { 
return false; 
} 
@Override 
public boolean onConnectException(INonBlockingConnection nbc, 
IOException arg1) throws IOException { 
return false; 
} 
@Override 
public boolean onData(INonBlockingConnection nbc) throws IOException, 
BufferUnderflowException, ClosedChannelException, 
MaxReadSizeExceededException { 
try{ 
if (nbc.available() == -1) { 
return false; 
} 
// 接受文件 
SocketService.acceptFile(nbc); 
// 解压 
SocketService.jieyaFile(); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
return true; 
} 
@Override 
public boolean onConnect(INonBlockingConnection nbc) throws IOException, 
BufferUnderflowException, MaxReadSizeExceededException { 
System.out.println(nbc.getRemoteAddress()+" 来访!"); 
return false; 
} 
} 
第二步: 创建服务端类SocketServer
package com.socket;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.concurrent.TimeUnit;
import org.xsocket.WorkerPool;
import org.xsocket.connection.IServer;
import org.xsocket.connection.Server;
public class SocketServer {
 private static IServer server = null;
 
 private static final int PORT = 2049;
 
 public static void start() {
  
  try {
   server = new Server(PORT,new SocketHandler());
   
   server.setAutoflush(false);
   
   // minSize, maxSize, keepalive, timeunit, taskqueuesize, isDaemon
   WorkerPool workerPool = new WorkerPool(200, 1000, 1800, TimeUnit.SECONDS, 1000, false);
   // 预启动所有核心线程
   workerPool.prestartAllCoreThreads();
   
   server.setWorkerpool(workerPool);
   
   server.start();
   
   System.out.println("Test SocketServer Started...");
   
  } catch (UnknownHostException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 
 public static void stop() {
  if (server != null && server.isOpen()) {
   try {
    server.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
 
 public static void main(String[] args) {
  
  start();
 }
}
第三步:创建处理业务逻辑的类SocketService
package com.socket;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.xsocket.connection.INonBlockingConnection;
import org.xsocket.connection.NonBlockingConnection;
public class SocketService {
public static final byte[] buf = new byte[1024];
 public static final int port = 2049;
 
 private static final int BYTE_LENGTH = 1024;
 
 public static final String filePath = "d:\\testzip3.zip";
 
 public static final String zipFilePath = "d:\\testzip3";
 
 public static File zipFile;
 public static void test() {
  
  INonBlockingConnection nbc = null;
  
  try {
   System.out.println("连接中...");
   nbc = new NonBlockingConnection("192.168.1.49",port ,new SocketHandler());
   nbc.write("123");
  } catch (IOException e) {
   System.out.println("SocketService异常");
   e.printStackTrace();
  } 
 }
 
 /**
  * 上传文件
  * @param remoteAddr 远程服务器地址
  * @param filePath 要上传的文件地址
  */
 public static void uploadFile(String remoteAddr, String filePath) {
INonBlockingConnection nbc = null;
  DataInputStream dis = null;
  try {   
   // 连接
   nbc = new NonBlockingConnection(remoteAddr,port ,new SocketHandler());
dis = new DataInputStream(new FileInputStream(new File(filePath)));
   int len = 0 ;
   
   while ((len=dis.read(buf)) != -1) {
    nbc.write(buf, 0, len);
   }
  } catch (UnknownHostException e) {   
   e.printStackTrace();   
  } catch (IOException e) {   
   e.printStackTrace();   
  } finally {   
   if (dis != null) {
    try {
     dis.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
   if (nbc != null) {
    try {
     nbc.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }   
 }
 
 /**
  * 接受文件
  * */
 public static void acceptFile(INonBlockingConnection nbc) {
  
  try {
   // 创建一个字节缓冲区
   ByteBuffer byteBuffer = ByteBuffer.allocate(BYTE_LENGTH);
   zipFile = new File(filePath);
   DataOutputStream output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
   int len = 0;
   while ((len = nbc.read(byteBuffer)) != -1) {
    output.write(byteBuffer.array(),0,len);
    // 清理缓冲区
    byteBuffer.clear();
   }
   if (output != null) {
    try {
     output.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
   System.out.println("文件上传成功!");
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 
 /**
  * @param targetFile 要解压的文件
  * @param zipPath 解压路径
  * 不支持中文文件名
  */
 public static void jieyaFile() {
  ZipInputStream zis= null;
  FileOutputStream fos = null;
  try {
   // 判断目录是否存在
   File zipPathFile = new File(zipFilePath);
   if (!zipPathFile.exists()) {
    zipPathFile.mkdir();
   }
   zis = new ZipInputStream(new FileInputStream(new File(filePath)));
   
   ZipEntry entry = null;
   
   while ((entry=zis.getNextEntry())!=null) {
    File file = new File(zipFilePath+File.separator+entry.getName());
    // 是否是目录
    if(entry.isDirectory()) {
     file.mkdir();
    } else {
     fos = new FileOutputStream(file);
     int len =0;
     while ((len = zis.read(buf)) != -1) {
      fos.write(buf,0,len);
     }
     if (fos !=null) {
      fos.close();
     }
    }
   }
   System.out.println("文件解压成功!");
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   if (zis != null) {
    try {
     zis.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 }
 public static void main(String[] args) {
  
  //test();
  
  uploadFile("192.168.1.49", "d:\\testzip.zip");
 }
}
// 测试 进入命令行输入:telnet ip port
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号