首页 > 编程 > Java > 正文

浅析Java基于Socket的文件传输案例

2019-11-26 14:36:06
字体:
来源:转载
供稿:网友

本文实例介绍了Java基于Socket的文件传输案例,分享给大家供大家参考,具体内容如下

1、Java代码

package com.wf.demo.socket.socketfile;  import java.net.*; import java.io.*;  /**  * 2.socket的Util辅助类  *  * @author willson  *  */ public class ClientSocket {    private String ip;    private int port;    private Socket socket = null;    DataOutputStream out = null;    DataInputStream getMessageStream = null;    public ClientSocket(String ip, int port) {     this.ip = ip;     this.port = port;   }    /**    * 创建socket连接    *    * @throws Exception    *       exception    */   public void CreateConnection() throws Exception {      try {       socket = new Socket(ip, port);     } catch (Exception e) {       e.printStackTrace();       if (socket != null)         socket.close();       throw e;     } finally {     }   }    // 发送消息   public void sendMessage(String sendMessage) throws Exception {     try {       out = new DataOutputStream(socket.getOutputStream());       if (sendMessage.equals("Windows")) {         out.writeByte(0x1);         out.flush();         return;       }       if (sendMessage.equals("Unix")) {         out.writeByte(0x2);         out.flush();         return;       }       if (sendMessage.equals("Linux")) {         out.writeByte(0x3);         out.flush();       } else {         out.writeUTF(sendMessage);         out.flush();       }     } catch (Exception e) {       e.printStackTrace();       if (out != null)         out.close();       throw e;     } finally {     }   }    // 接受消息   public DataInputStream getMessageStream() throws Exception {     try {       getMessageStream = new DataInputStream(new BufferedInputStream(           socket.getInputStream()));       return getMessageStream;     } catch (Exception e) {       e.printStackTrace();       if (getMessageStream != null)         getMessageStream.close();       throw e;     } finally {     }   }    // 关闭连接   public void shutDownConnection() {     try {       if (out != null)         out.close();       if (getMessageStream != null)         getMessageStream.close();       if (socket != null)         socket.close();     } catch (Exception e) {     }   } } 

2、Java代码

package com.wf.demo.socket.socketfile;  import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.ServerSocket; import java.net.Socket;  /**  * 1.服务器端  *  * @author willson  *  */ public class ServerTest {      int port = 8821;    void start() {          Socket socket = null;          try {              ServerSocket serverSocket = new ServerSocket(port);              while (true) {         // 选择进行传输的文件         String filePath = "E://lib.zip";                  File fi = new File(filePath);          System.out.println("File Name:" + fi.getName() + ";/tFile Size():" + (int) fi.length() + "bytes");          // public Socket accept() throws         // IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。                   System.out.println("等待客户端连接,连接端口:" + port);         socket = serverSocket.accept();                  System.out.println("建立socket链接");                  DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));                  dis.readByte();          DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));                  DataOutputStream ps = new DataOutputStream(socket.getOutputStream());                  // 将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java         // 4th里有现成的代码。         ps.writeUTF(fi.getName());         ps.flush();         ps.writeLong((long) fi.length());         ps.flush();          int bufferSize = 8192;         byte[] buf = new byte[bufferSize];          while (true) {                      int read = 0;           if (fis != null) {             read = fis.read(buf);           }            if (read == -1) {             break;           }           ps.write(buf, 0, read);         }                  ps.flush();         // 注意关闭socket链接哦,不然客户端会等待server的数据过来,         // 直到socket超时,导致数据不完整。         fis.close();         socket.close();                  System.out.println("文件传输完成/n");       }      } catch (Exception e) {       e.printStackTrace();     }   }    public static void main(String arg[]) {     new ServerTest().start();   } }   


3、客户端

package com.wf.demo.socket.socketfile;  import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileOutputStream;  /**  * 3.客户端  *  * @author willson  *  */ public class ClientTest {    private ClientSocket cs = null;    private String ip = "localhost";// 设置成服务器IP    private int port = 8821;    private String sendMessage = "Windwos";    public ClientTest() {      try {       if (createConnection()) {         sendMessage();         getMessage("F://");       }     } catch (Exception ex) {       ex.printStackTrace();     }   }    private boolean createConnection() {          cs = new ClientSocket(ip, port);     try {       cs.CreateConnection();       System.out.print("连接服务器成功!" + "/n");       return true;     } catch (Exception e) {       System.out.print("连接服务器失败!" + "/n");       return false;     }    }    private void sendMessage() {          if (cs == null)       return;     try {       cs.sendMessage(sendMessage);     } catch (Exception e) {       System.out.print("发送消息失败!" + "/n");     }   }    private void getMessage(String savePath) {          if (cs == null)       return;     DataInputStream inputStream = null;     try {       inputStream = cs.getMessageStream();     } catch (Exception e) {       System.out.print("接收消息缓存错误/n");       return;     }      try {              // 本地保存路径,文件名会自动从服务器端继承而来。       int bufferSize = 8192;       byte[] buf = new byte[bufferSize];       int passedlen = 0;       long len = 0;        savePath += inputStream.readUTF();       DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))));       len = inputStream.readLong();        System.out.println("File Size():" + len + "bytes");       System.out.println("开始接收文件!" + "/n");        while (true) {                  int read = 0;         if (inputStream != null) {           read = inputStream.read(buf);         }         passedlen += read;         if (read == -1) {           break;         }         // 下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比         System.out.println("文件接收了" + (passedlen * 100 / len) + "%/n");         fileOut.write(buf, 0, read);       }       System.out.println("接收完成,文件存为" + savePath + "/n");        fileOut.close();     } catch (Exception e) {       System.out.println("接收消息错误" + "/n");       return;     }   }    public static void main(String arg[]) {     new ClientTest();   } } 

希望本文所述对大家学习java程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表