一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java Socket實現(xiàn)文件傳輸示例代碼

Java Socket實現(xiàn)文件傳輸示例代碼

2020-07-31 15:57Giraffe8 Java教程

這篇文章主要介紹了Java Socket實現(xiàn)文件傳輸示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

最近學Socket學上癮了,就寫了一個簡單的文件傳輸程序。

客戶端設(shè)計思路:客戶端與服務端建立連接,選擇客戶端本地文件,先將文件名及大小等屬性發(fā)送給服務端,再將文件通過流的方式傳輸給服務端。傳輸?shù)倪M度打印到控制臺中,直到傳輸完成。

服務端設(shè)計思路:服務端接收客戶端的請求(阻塞式),每接收到一個客戶端請求連接后,就新開一個處理文件的線程,開始寫入流,將文件到服務器的指定目錄下,并與傳輸過來的文件同名。
下面是客戶端和服務端的代碼實現(xiàn):

客戶端代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.Socket;
 
/**
 * 文件傳輸Client端<br>
 * 功能說明:
 *
 * @author 大智若愚的小懂
 * @Date 2016年09月01日
 * @version 1.0
 */
public class FileTransferClient extends Socket {
 
  private static final String SERVER_IP = "127.0.0.1"; // 服務端IP
  private static final int SERVER_PORT = 8899; // 服務端端口
 
  private Socket client;
 
  private FileInputStream fis;
 
  private DataOutputStream dos;
 
  /**
   * 構(gòu)造函數(shù)<br/>
   * 與服務器建立連接
   * @throws Exception
   */
  public FileTransferClient() throws Exception {
    super(SERVER_IP, SERVER_PORT);
    this.client = this;
    System.out.println("Cliect[port:" + client.getLocalPort() + "] 成功連接服務端");
  }
 
  /**
   * 向服務端傳輸文件
   * @throws Exception
   */
  public void sendFile() throws Exception {
    try {
      File file = new File("E:\\JDK1.6中文參考手冊(JDK_API_1_6_zh_CN).CHM");
      if(file.exists()) {
        fis = new FileInputStream(file);
        dos = new DataOutputStream(client.getOutputStream());
 
        // 文件名和長度
        dos.writeUTF(file.getName());
        dos.flush();
        dos.writeLong(file.length());
        dos.flush();
 
        // 開始傳輸文件
        System.out.println("======== 開始傳輸文件 ========");
        byte[] bytes = new byte[1024];
        int length = 0;
        long progress = 0;
        while((length = fis.read(bytes, 0, bytes.length)) != -1) {
          dos.write(bytes, 0, length);
          dos.flush();
          progress += length;
          System.out.print("| " + (100*progress/file.length()) + "% |");
        }
        System.out.println();
        System.out.println("======== 文件傳輸成功 ========");
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if(fis != null)
        fis.close();
      if(dos != null)
        dos.close();
      client.close();
    }
  }
 
  /**
   * 入口
   * @param args
   */
  public static void main(String[] args) {
    try {
      FileTransferClient client = new FileTransferClient(); // 啟動客戶端連接
      client.sendFile(); // 傳輸文件
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
 
}

服務端代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.math.RoundingMode;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DecimalFormat;
 
/**
 * 文件傳輸Server端<br>
 * 功能說明:
 *
 * @author 大智若愚的小懂
 * @Date 2016年09月01日
 * @version 1.0
 */
public class FileTransferServer extends ServerSocket {
 
  private static final int SERVER_PORT = 8899; // 服務端端口
 
  private static DecimalFormat df = null;
 
  static {
    // 設(shè)置數(shù)字格式,保留一位有效小數(shù)
    df = new DecimalFormat("#0.0");
    df.setRoundingMode(RoundingMode.HALF_UP);
    df.setMinimumFractionDigits(1);
    df.setMaximumFractionDigits(1);
  }
 
  public FileTransferServer() throws Exception {
    super(SERVER_PORT);
  }
 
  /**
   * 使用線程處理每個客戶端傳輸?shù)奈募?
   * @throws Exception
   */
  public void load() throws Exception {
    while (true) {
      // server嘗試接收其他Socket的連接請求,server的accept方法是阻塞式的
      Socket socket = this.accept();
      /**
       * 我們的服務端處理客戶端的連接請求是同步進行的, 每次接收到來自客戶端的連接請求后,
       * 都要先跟當前的客戶端通信完之后才能再處理下一個連接請求。 這在并發(fā)比較多的情況下會嚴重影響程序的性能,
       * 為此,我們可以把它改為如下這種異步處理與客戶端通信的方式
       */
      // 每接收到一個Socket就建立一個新的線程來處理它
      new Thread(new Task(socket)).start();
    }
  }
 
  /**
   * 處理客戶端傳輸過來的文件線程類
   */
  class Task implements Runnable {
 
    private Socket socket;
 
    private DataInputStream dis;
 
    private FileOutputStream fos;
 
    public Task(Socket socket) {
      this.socket = socket;
    }
 
    @Override
    public void run() {
      try {
        dis = new DataInputStream(socket.getInputStream());
 
        // 文件名和長度
        String fileName = dis.readUTF();
        long fileLength = dis.readLong();
        File directory = new File("D:\\FTCache");
        if(!directory.exists()) {
          directory.mkdir();
        }
        File file = new File(directory.getAbsolutePath() + File.separatorChar + fileName);
        fos = new FileOutputStream(file);
 
        // 開始接收文件
        byte[] bytes = new byte[1024];
        int length = 0;
        while((length = dis.read(bytes, 0, bytes.length)) != -1) {
          fos.write(bytes, 0, length);
          fos.flush();
        }
        System.out.println("======== 文件接收成功 [File Name:" + fileName + "] [Size:" + getFormatFileSize(fileLength) + "] ========");
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        try {
          if(fos != null)
            fos.close();
          if(dis != null)
            dis.close();
          socket.close();
        } catch (Exception e) {}
      }
    }
  }
 
  /**
   * 格式化文件大小
   * @param length
   * @return
   */
  private String getFormatFileSize(long length) {
    double size = ((double) length) / (1 << 30);
    if(size >= 1) {
      return df.format(size) + "GB";
    }
    size = ((double) length) / (1 << 20);
    if(size >= 1) {
      return df.format(size) + "MB";
    }
    size = ((double) length) / (1 << 10);
    if(size >= 1) {
      return df.format(size) + "KB";
    }
    return length + "B";
  }
 
  /**
   * 入口
   * @param args
   */
  public static void main(String[] args) {
    try {
      FileTransferServer server = new FileTransferServer(); // 啟動服務端
      server.load();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

測試的結(jié)果(客戶端):

Java Socket實現(xiàn)文件傳輸示例代碼

測試的結(jié)果(服務端):

Java Socket實現(xiàn)文件傳輸示例代碼

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/huang930528/article/details/52401565

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 青柠在线完整高清观看免费 | 亚洲国产欧美日韩在线一区 | 亚洲第一区欧美日韩精品 | 亚洲美色综合天天久久综合精品 | 亚洲午夜久久久久国产 | 美女福利视频网站 | 久久性生大片免费观看性 | 精品无码一区二区三区中文字幕 | chinese圣水黄金调教 | 国产精品边做边接电话在线观看 | 成人综合婷婷国产精品久久免费 | 国产成人咱精品视频免费网站 | 俄罗斯激情性孕妇孕交大全 | 无码欧美喷潮福利XXXX | 欧美成人午夜片一一在线观看 | 青青国产成人久久激情911 | 香蕉免费看一区二区三区 | 午夜精品久久久 | 亚洲小视频在线 | 四虎影院网址大全 | 污网站免费观看在线高清 | 99精品免费在线观看 | 亚洲国产精品自在在线观看 | 99热这里只有精品在线播放 | 99午夜高清在线视频在观看 | 169pp美女| 日剧整部剧护妻狂魔免费观看全集 | 国产精品全国探花在线观看 | 欧美摘花破处 | 2021国产精品露脸在线 | 亚洲AV 中文字幕 国产 欧美 | ccc在线在线36 | 日韩欧美精品一区二区 | 饭冈加奈子在线播放观看 | 亚洲欧美日韩精品 | 国内精品久久久久久久久 | 亚洲高清色图 | 亚洲国产欧美在线人成aaaa20 | 四虎网站在线 | 国产网站免费在线观看 | 免费一级毛片在线播放 |