Socket 外网 文件传输 大文件
1. Server side code:package test.bwl;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.Calendar;import java.util.Date;import java.util.zip.ZipInputStream;import java.util.zip.ZipOutputStream;import org.apache.commons.io.FileUtils;import org.apache.commons.io.IOUtils;public class SocketManager {/** * @param args * @throws IOException*/public static void main(String[] args) {SocketManager manager = new SocketManager();manager.doListen();}public void doListen() {ServerSocket server;try {server = new ServerSocket(9991);while (true) {Socket client = server.accept();new Thread(new SSocket(client)).start();}} catch (IOException e) {e.printStackTrace();}}//服务器进程class SSocket implements Runnable {Socket socket;private final StringBuffer FILE_PATH = new StringBuffer("c:/");static final int BUFFER = 2048;public SSocket(Socket client) {this.socket = client;}public void run() {Calendar today = Calendar.getInstance();File file = new File(FILE_PATH.append(today.get(Calendar.YEAR)+"-"+today.get(Calendar.MONTH)+"-"+today.get(Calendar.DAY_OF_MONTH)).toString());if(!file.exists()){file.mkdir();}DataOutputStream serverToClientTextStream = null; FileOutputStream writeFileToLocalBinStream = null;try { serverToClientTextStream = new DataOutputStream(socket.getOutputStream());serverToClientTextStream.writeUTF("Server received done!");FileUtils.copyInputStreamToFile(socket.getInputStream(), new File(file.getPath() + "/" + new Date().getTime())); } catch (IOException e) {e.printStackTrace();}finally {if (socket != null) {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}}}
9991: 服务器端监听端口号。
2. Client side code:
package test.bwl;import io.ReadFile;import java.io.BufferedInputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;import java.util.zip.ZipFile;import java.util.zip.ZipInputStream;import java.util.zip.ZipOutputStream;import org.apache.commons.io.FileUtils;import org.apache.commons.io.IOUtils;public class SocketClient { private static final int BUFFER = 2048;public static void main(String[] args) {Socket socket = null; byte[] buf = new byte; try {socket = new Socket(InetAddress.getByName("www.domain.com"),9991);// get input and output stream of socket FileOutputStream clientToServerStream = (FileOutputStream)socket.getOutputStream();DataInputStream serverToClientStream = new DataInputStream(socket.getInputStream());// write data to server from clientInputStream is = new FileInputStream(new File("c:/SYSTEM01.DBF"));BufferedInputStream bis = new BufferedInputStream(is); while(bis.read(buf) != -1){ clientToServerStream.write(buf); clientToServerStream.flush();} System.out.println(serverToClientStream.readUTF());} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (socket != null) {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}} www.domain.com: 服务器域名 或者 IP
9991: socket server 监听端口号
3. 配置路由器 NAT设置
3.1 端口触发: 我在电脑上用的是花生壳,3389是花生壳的端口号。
http://dl.iteye.com/upload/attachment/425560/dc397595-804d-30d7-9e52-1893a5603037.png
3.2 虚拟服务器
192.168.1.4 : 花生壳主机IP(不过好像写别的也可以)
192.168.1.3 : socket server 主机 局域网IP
http://dl.iteye.com/upload/attachment/425562/20559fcb-d0ed-3201-9d27-046f4ffac4c8.png
4. 启动Socket server side。运行 SocketClient.
经测试成功。
页:
[1]