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

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

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

服務器之家 - 編程語言 - Java教程 - java實現客戶端向服務器發送文件

java實現客戶端向服務器發送文件

2021-03-19 11:58殘舞亂步 Java教程

這篇文章主要為大家詳細介紹了java實現客戶端向服務器發送文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了java實現客戶端向服務器發送文件的具體代碼,供大家參考,具體內容如下

服務器源代碼:

?
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
  
/**
 *
 * 文件名:ServerReceive.java
 * 實現功能:作為服務器接收客戶端發送的文件
 *
 * 具體實現過程:
 * 1、建立SocketServer,等待客戶端的連接
 * 2、當有客戶端連接的時候,按照雙方的約定,這時要讀取一行數據
 *   其中保存客戶端要發送的文件名和文件大小信息
 * 3、根據文件名在本地創建文件,并建立好流通信
 * 4、循環接收數據包,將數據包寫入文件
 * 5、當接收數據的長度等于提前文件發過來的文件長度,即表示文件接收完畢,關閉文件
 * 6、文件接收工作結束
 *
 *
 * 【注:此代碼僅為演示客戶端與服務器傳送文件使用,
 *   每一個數據包之前沒有文件協議命令
 *   具體的協議傳輸和文件傳出的使用階段可根據自己程序自行放置】
 *
 *
 * 作者:小菜鳥
 * 創建時間:2014-08-19
 *
 * */
 
public class ServerReceive {
 
  public static void main(String[] args) {
     
    /**與服務器建立連接的通信句柄*/
    ServerSocket ss = null;
    Socket s = null;
     
    /**定義用于在接收后在本地創建的文件對象和文件輸出流對象*/
    File file = null;
    FileOutputStream fos = null;
     
    /**定義輸入流,使用socket的inputStream對數據包進行輸入*/
    InputStream is = null;
     
    /**定義byte數組來作為數據包的存儲數據包*/
    byte[] buffer = new byte[4096 * 5];
     
    /**用來接收文件發送請求的字符串*/
    String comm = null;
     
     
    /**建立socekt通信,等待服務器進行連接*/
    try {
      ss = new ServerSocket(4004);
      s = ss.accept();
    } catch (IOException e) {
      e.printStackTrace();
    }
     
     
    /**讀取一行客戶端發送過來的約定信息*/
    try {
      InputStreamReader isr = new InputStreamReader(s.getInputStream());
      BufferedReader br = new BufferedReader(isr);
      comm = br.readLine();
    } catch (IOException e) {
      System.out.println("服務器與客戶端斷開連接");
    }
     
    /**開始解析客戶端發送過來的請求命令*/
    int index = comm.indexOf("/#");
     
    /**判斷協議是否為發送文件的協議*/
    String xieyi = comm.substring(0, index);
    if(!xieyi.equals("111")){
      System.out.println("服務器收到的協議碼不正確");
      return;
    }
     
    /**解析出文件的名字和大小*/
    comm = comm.substring(index + 2);
    index = comm.indexOf("/#");
    String filename = comm.substring(0, index).trim();
    String filesize = comm.substring(index + 2).trim();
     
     
    /**創建空文件,用來進行接收文件*/
    file = new File(filename);
    if(!file.exists()){
      try {
        file.createNewFile();
      } catch (IOException e) {
        System.out.println("服務器端創建文件失敗");
      }
    }else{
      /**在此也可以詢問是否覆蓋*/
      System.out.println("本路徑已存在相同文件,進行覆蓋");
    }
     
    /**【以上就是客戶端代碼中寫到的服務器的準備部分】*/
     
     
    /**
     * 服務器接收文件的關鍵代碼*/
    try {
      /**將文件包裝到文件輸出流對象中*/
      fos = new FileOutputStream(file);
      long file_size = Long.parseLong(filesize);
      is = s.getInputStream();
      /**size為每次接收數據包的長度*/
      int size = 0;
      /**count用來記錄已接收到文件的長度*/
      long count = 0;
       
      /**使用while循環接收數據包*/
      while(count < file_size){
        /**從輸入流中讀取一個數據包*/
        size = is.read(buffer);
         
        /**將剛剛讀取的數據包寫到本地文件中去*/
        fos.write(buffer, 0, size);
        fos.flush();
         
        /**將已接收到文件的長度+size*/
        count += size;
        System.out.println("服務器端接收到數據包,大小為" + size);
      }
       
    } catch (FileNotFoundException e) {
      System.out.println("服務器寫文件失敗");
    } catch (IOException e) {
      System.out.println("服務器:客戶端斷開連接");
    }finally{
      /**
       * 將打開的文件關閉
       * 如有需要,也可以在此關閉socket連接
       * */
      try {
        if(fos != null)
          fos.close();
      } catch (IOException e) {
        e.printStackTrace();
      }//catch (IOException e)
    }//finally
 
  }//public static void main(String[] args)
}//public class ServerReceive

客戶端源代碼:

?
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
139
140
141
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
 
 
/**
 *
 * 文件名:ClientSend.java
 * 實現功能:作為客戶端向服務器發送一個文件
 *
 * 具體實現過程:
 * 1、建立與服務器端的連接,IP:127.0.0.1, port:4004
 * 2、將文件的名字和大小通過自定義的文件傳輸協議,發送到服務器
 * 3、循環讀取本地文件,將文件打包發送到數據輸出流中
 * 4、關閉文件,結束傳輸
 *
 * 【注:此代碼僅為演示客戶端與服務器傳送文件使用,
 *   每一個數據包之前沒有文件協議命令
 *   具體的協議傳輸和文件傳出的使用階段可根據自己程序自行放置】
 *
 *
 * 作者:小菜鳥
 * 創建時間:2014-08-19
 *
 * */
 
public class ClientSend {
 
  public static void main(String[] args) {
     
    /**與服務器建立連接的通信句柄*/
    Socket s = null;
     
    /**定義文件對象,即為要發送的文件
     * 如果使用絕對路徑,不要忘記使用'/'和'\'的區別
     * 具體區別,請讀者自行查詢
     * */
    File sendfile = new File("API.CHM");
    /**定義文件輸入流,用來打開、讀取即將要發送的文件*/
    FileInputStream fis = null;
    /**定義byte數組來作為數據包的存儲數據包*/
    byte[] buffer = new byte[4096 * 5];
     
    /**定義輸出流,使用socket的outputStream對數據包進行輸出*/
    OutputStream os = null;
     
     
    /**檢查要發送的文件是否存在*/
    if(!sendfile.exists()){
      System.out.println("客戶端:要發送的文件不存在");
      return;
    }
     
     
    /**與服務器建立連接*/
    try {
      s = new Socket("127.0.0.1", 4004);
    }catch (IOException e) {
      System.out.println("未連接到服務器");
    }
     
    /**用文件對象初始化fis對象
     * 以便于可以提取出文件的大小
     * */
    try {
      fis = new FileInputStream(sendfile);
    } catch (FileNotFoundException e1) {
      e1.printStackTrace();
    }
 
     
    /**首先先向服務器發送關于文件的信息,以便于服務器進行接收的相關準備工作
     * 具體的準備工作,請查看服務器代碼。
     *
     * 發送的內容包括:發送文件協議碼(此處為111)/#文件名(帶后綴名)/#文件大小
     * */
    try {
      PrintStream ps = new PrintStream(s.getOutputStream());
      ps.println("111/#" + sendfile.getName() + "/#" + fis.available());
      ps.flush();
    } catch (IOException e) {
      System.out.println("服務器連接中斷");
    }
     
     
    /**
     * 此處睡眠2s,等待服務器把相關的工作準備好
     * 也是為了保證網絡的延遲
     * 讀者可自行選擇添加此代碼
     * */
    try {
      Thread.sleep(2000);
    } catch (InterruptedException e1) {
      e1.printStackTrace();
    }
     
     
     
    /**之前的準備工作結束之后
     * 下面就是文件傳輸的關鍵代碼
     * */
    try {
       
      /**獲取socket的OutputStream,以便向其中寫入數據包*/
      os = s.getOutputStream();
       
      /** size 用來記錄每次讀取文件的大小*/
      int size = 0;
       
      /**使用while循環讀取文件,直到文件讀取結束*/
      while((size = fis.read(buffer)) != -1){
        System.out.println("客戶端發送數據包,大小為" + size);
        /**向輸出流中寫入剛剛讀到的數據包*/
        os.write(buffer, 0, size);
        /**刷新一下*/
        os.flush();
      }
    } catch (FileNotFoundException e) {
      System.out.println("客戶端讀取文件出錯");
    } catch (IOException e) {
      System.out.println("客戶端輸出文件出錯");
    }finally{
       
      /**
       * 將打開的文件關閉
       * 如有需要,也可以在此關閉socket連接
       * */
      try {
        if(fis != null)
          fis.close();
      } catch (IOException e) {
        System.out.println("客戶端文件關閉出錯");
      }//catch (IOException e)
    }//finally
     
  }//public static void main(String[] args)
}//public class ClientSend

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

原文鏈接:http://blog.csdn.net/junwei_yu/article/details/38687667

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 喜爱夜蒲2三级做爰 | 91九色麻豆 | 国产精品视频免费视频 | 国产成人在线小视频 | 午夜影院在线免费观看 | 国内精品国语自产拍在线观看55 | 扒开大腿狠狠挺进视频 | 2012年免费中文视频 | 国产精品欧美日韩一区二区 | 四虎影视永久在线观看 | 日韩一区二区在线视频 | 精品国产香蕉 | 天堂8在线天堂资源在线 | 国产另类视频 | 日韩欧美一区二区三区免费看 | 无限韩国视频免费播放 | 爱情岛永久成人免费网站 | 欧美xingai| 国产在亚洲线视频观看 | 男人搡女人视频免费看 | 欧美一级高清免费a | ai换脸杨幂被c在线观看 | 九九热在线观看视频 | 果冻传媒在线播放观看w | 久久综合中文字幕佐佐木希 | 暖暖视频免费观看视频中国.韩剧 | 无遮免费网站在线入口 | 午夜精品在线 | 日本道在线播放 | 四虎影视永久在线观看 | 性欧美hd | 91极品女神久色在线播放 | 四色6677最新永久网站 | 九九精品视频在线观看九九 | 亚洲精品电影天堂网 | 亚洲视频在线一区二区三区 | 国产农村乱子伦精品视频 | 亚洲 欧美 国产 在线观看 | 99九九精品免费视频观看 | 男人机机桶女人 | 亚洲男人天堂网站 |