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

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

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java基于Socket做一個簡單下載器

java基于Socket做一個簡單下載器

2020-06-07 12:20yesz12358 JAVA教程

這篇文章主要為大家詳細介紹了java如何基于Socket制作一個簡單下載器,感興趣的小伙伴們可以參考一下

本文實例為大家分享了java基于Socket制作下載器的過程,及相關代碼,供大家參考,具體內容如下

1.首先要建立一個服務器用來處理信息并給客戶端傳輸文件(電腦)
 我是用電腦開了一個WIFI,手機連上后使用scoket傳輸的 
SERVERIP要根據自己實際情況更改。端口也可以隨便更改0~65535,盡量選大一點 

?
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
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
 
/**
 * 測試Android客戶端與PC服務器通過socket進行交互 服務器端:接收客戶端的信息并回送給客戶
 *
 * @author Ameyume
 *
 */
public class Server implements Runnable {
 //定義傳輸的IP和端口信息
 public static final String SERVERIP = "192.168.155.1";
 //定義的9888端口
 public static final int SERVERPORT = 9888;
 //定義文件
 private File file = null;
 
 public static void main(String[] args) {
 //建立調用線程執行傳輸的方法
 Thread desktopServerThread = new Thread(new Server());
 desktopServerThread.start();
 }
 
 public void run() {
 try {
  System.out.println("S: Connecting...9888");
 
  //創建套接字
  ServerSocket serverSocket = new ServerSocket(SERVERPORT);
  while (true) {
  // 等待接受客戶端請求
  Socket client = serverSocket.accept();
 
  System.out.println("S: Receiving...9888");
 
  try {
 
   // 接受客戶端信息
   BufferedReader in = new BufferedReader(
    new InputStreamReader(client.getInputStream()));
   System.out.println("S: 接收客戶端信息");
   // 讀取客戶端的信息
   String str = in.readLine();
   String str1 = str.substring(0,2);
   String str2 = str.substring(2);
   System.out.println(str);
   //根據客戶端的請求找到對應的文件并把文件大小的值傳過去
   if (str.equals("file_size")) {
   
   //定義你要傳輸的文件(我這里寫的是E盤下的某個文件)
   file = new File("E:\\某個文件");
   //輸入流
   FileInputStream fis = new FileInputStream(file);
   //輸出流
   BufferedInputStream bis = new BufferedInputStream(fis);
   //計算將要傳輸的文件大小
   int sum = bis.available();
   //將int型的文件大小轉成字符串
   String s = String.valueOf(sum);
   System.out.println(s);
   //建立輸出流以發送文件大小的信息
   PrintWriter out = new PrintWriter(new BufferedWriter(
    new OutputStreamWriter(client.getOutputStream())),
    true);
   //發送文件的大小信息
   out.println(s);
   //關閉流
   out.flush();
   bis.close();
 
   } else if (str1.equals("ok")) {
   int a = Integer.parseInt(str2);
   
   // 客戶端收到文件大小的值后,再根據客戶端傳來的“ok”將文件傳過去
   BufferedOutputStream bos = new BufferedOutputStream(
    client.getOutputStream());
   
   System.out.println("S: 開始傳輸");
 
   //開始傳輸
   if (true) {
    //輸入流
    FileInputStream fis = new FileInputStream(file);
    //跳過前面已經傳輸過的字節
    fis.skip(a);
    //緩沖輸入流
    BufferedInputStream bis = new BufferedInputStream(
     fis);
 
    int t = -1;
    while ((t = bis.read()) >= 0) {
    bos.write(t);
    }
 
    String s = "已傳輸";
    //關閉流
    bos.flush();
    bis.close();
    bos.close();
    // serverSocket.close();
 
    System.out.println("S: Received: '" + s + "'");
   }
   } else {
   System.out
    .println("Not receiver anything from client!");
   }
  } catch (Exception e) {
   System.out.println("S: Error 1");
   e.printStackTrace();
  } finally {
   client.close();
   System.out.println("S: Done.");
  }
  }
 } catch (Exception e) {
  System.out.println("S: Error 2");
  e.printStackTrace();
 }
 }
 
}

 2.再建立一個客戶端,我這里用的是安卓寫的MainActivity.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
package com.xhy.zz;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
 
 
public class MainActivity extends Activity {
 
 
 
 // 定義Handler
 public static Handler myHandler;
 
 // 定義intent
 private Intent intent;
 
 
 // 獲取控件
 private TextView text_name;
 private TextView text_percent;
 private Button btn_start;
 private Button btn_stop;
 
 
 // 文件顯示
 private TextView text_sel_file;
 
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 // TODO Auto-generated method stub
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 
 
 
 text_name = (TextView) findViewById(R.id.text_name);
 
 
 text_percent = (TextView) findViewById(R.id.text_percent);
 
 btn_start = (Button) findViewById(R.id.btn_start);
 
 btn_stop = (Button) findViewById(R.id.btn_stop);
 
 
 
 
 // 按鈕一的返回信息,顯示進度
 myHandler = new Handler() {
  @Override
  public void handleMessage(Message msg) {
  super.handleMessage(msg);
 
  if (msg.what == 0x0001) {
   Bundle data = msg.getData();
   String str = data.getString("value");
   text_percent.setText(str);
  }
  }
 };
 // 顯式的方式調用HelloService
 intent = new Intent(this, DownService.class);
 // 設置啟動按鈕點擊事件
 btn_start.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
  
  // 開啟服務
  startService(intent);
  
  }
 });
 // 設置停止按鈕點擊事件
 btn_stop.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
  // 關閉服務
  stopService(intent);
  }
 });
 
 
 
 
 }
 
 /***
 * 被調用Activity一旦返回值 該回調方法將被系統自動調用
 */
 @Override
 protected void onActivityResult(int requestCode, int resultCode,
  Intent intent) {
 super.onActivityResult(requestCode, resultCode, intent);
 // 如果請求碼是0
 // 并且返回的結果碼為1
 // 請求的Activity可能返回多種結果碼
 if (requestCode == 0 && resultCode == 1) {
  // 取出數據
  Bundle data = intent.getExtras();
  String str = data.getString("files");
  // 顯示數據
  text_sel_file.setText(str);
 }
 }
 
}

3.activity_main.xml文件

?
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
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >
  
  
 
  <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:orientation="horizontal" >
 
    <TextView
      android:id="@+id/text_name"
      android:layout_width="160dp"
      android:layout_height="wrap_content"
      android:layout_gravity="center_vertical"
      android:text="1" />
 
    <TextView
      android:id="@+id/text_percent"
      android:layout_width="50dp"
      android:layout_height="wrap_content"
      android:layout_gravity="center_vertical"
      android:layout_marginLeft="20dp"
      android:text="0%"/>
 
    <LinearLayout
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginLeft="20dp"
      android:orientation="vertical" >
      <Button
        android:id="@+id/btn_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="start"
        />
      <Button
        android:id="@+id/btn_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="stop"
        />
      
    </LinearLayout>
  </LinearLayout
</LinearLayout>

4.DownService用于在后臺開啟線程執行下載 

?
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
package com.xhy.zz;
 
 
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
 
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Environment;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
 
public class DownService extends Service {
 private static final String TAG = "Socket_Android";
 
 // Preferece機制操作的文件名
 public static final String PREFERENCE_NAME = "DownService";
 // Preferece機制的操作模式
 public static int MODE = Context.MODE_PRIVATE;
 
 // 線程
 private Thread workThread;
 // 定義文件名
 private String filename="file";
 
 // 端口號
 private int port = 9888;
 
 private boolean isStop = false;
 
 /***
 * 必須要實現的方法
 */
 @Override
 public IBinder onBind(Intent intent) {
 return null;
 }
 
 @Override
 public void onCreate() {
 super.onCreate();
 
 }
 
 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {
 
 Log.v("TCP", filename);
 // 建立傳輸的方法
 Runnable backgroundWork = new Runnable() {
  @Override
  public void run() {
 
   // setTitle("測試Socket連接");
   Socket socket = null;
   Socket socket1 = null;
 
   try {
   /*
    * 指定Server的IP地址,此地址為局域網地址,如果是使用WIFI上網,則為PC機的WIFI IP地址
    * 在ipconfig查看到的IP地址如下: Ethernet adapter 無線網絡連接:
    * Connection-specific DNS Suffix . : IP Address. . . .
    * . . . . . . . . : 192.168.155.1
    */
   InetAddress serverAddr = InetAddress
    .getByName("192.168.155.1");// TCPServer.SERVERIP
   Log.d("TCP", "C: Connecting...");
   Log.d("TCP", filename + " " + port);
   // 應用Server的IP和端口建立Socket對象,向服務端發送請求獲取文件大小的值
   socket1 = new Socket(serverAddr, port);
   String message = "---Test_Socket_Android---";
 
   Log.d("TCP", "C: Sending: '" + message + "'");
 
   // 將信息通過這個對象來發送給Server
   PrintWriter out = new PrintWriter(new BufferedWriter(
    new OutputStreamWriter(
     socket1.getOutputStream())), true);
 
   // 把用戶輸入的內容發送給server
   out.println("file_size");
   out.flush();
 
   // 接收服務器信息
   BufferedReader in = new BufferedReader(
    new InputStreamReader(socket1.getInputStream()));
   // 獲取文件大小
   String str1 = in.readLine();
 
   Log.d("TCP", str1);
   // 將文件大小轉成int型
   int sum = Integer.parseInt(str1);
   Log.d("TCP", str1);
   // 關閉輸入流
   in.close();
 
   SharedPreferences sharedPreferences = getSharedPreferences(
    PREFERENCE_NAME, MODE);
 
   SharedPreferences.Editor editor = sharedPreferences
    .edit();
   //取出已經傳輸了的字節
   int pre = sharedPreferences.getInt("DownService", 0);
   int _pre = pre;
   //將其轉化為字符串以便發送給服務端
   String s = String.valueOf(_pre);
 
   // 應用Server的IP和端口建立Socket對象再次向服務端發送請求,以獲取文件內容
   socket = new Socket(serverAddr, port);
 
   // 向服務端發送請求獲得文件的字符
   PrintWriter out1 = new PrintWriter(
    new BufferedWriter(new OutputStreamWriter(
     socket.getOutputStream())), true);
 
   out1.println("ok"+s);
   out1.flush();
   out.close();
   
 
   // 定義輸入流
   BufferedInputStream bis = new BufferedInputStream(
    socket.getInputStream());
 
   String file1 = filename;
   String file;
   // 判斷手機是否插入了SDCard,是則將文件插入內存卡
   if (Environment.getExternalStorageState().equals(
    Environment.MEDIA_MOUNTED)) {
    File sdCard = Environment
     .getExternalStorageDirectory();
 
    // SD卡定義文件
    file = sdCard.getCanonicalFile() + "/" + file1;
    // 定義文件輸出流
    FileOutputStream fos = new FileOutputStream(file,true);
    try {
    int t = -1;
    int downloaded = pre;
 
    // 定義每次傳輸的字節數
    byte[] buff = new byte[8192];
    Log.i("sum", sum + "");
    // 開始將服務端的文件寫入手機SD卡中
    while ((t = bis.read(buff)) != -1) {
     if (isStop == true) {
     break;
     }
     fos.write(buff, 0, t);
     downloaded += t;
     
     //將傳輸的進度存儲起來
     editor.putInt("DownService", downloaded);
     editor.commit();
     
     //當傳完了則把存儲信息歸零
     if (downloaded == sum) {
     editor.putInt("DownService", 0);
     editor.commit();
     }
     // 獲得文件傳輸的進度
     float wb = ((downloaded * 100) / (float) sum);
     int wi = (int) wb;
     System.out.println(downloaded);
     String str = String.valueOf(wi) + "%";
 
     // 將文件的傳輸進度給送給BaseActivity,以顯示給用戶
     Message msg = new Message(); // 生成消息
     // 生成消息
     msg.what = 0x0001; // 設置消息類型
     // 生成Bundle攜帶數據
     Bundle data = new Bundle();
     data.putString("value", str);
     msg.setData(data);
     // 利用Handler發送消息
     MainActivity.myHandler.sendMessage(msg);
 
    }
    
    // 關閉輸入輸出流
    bis.close();
    fos.flush();
    fos.close();
 
    } catch (Exception e) {
    bis.close();
    fos.flush();
    fos.close();
    }
   }
   Log.d(TAG, "From server:'已接收" + "'");
   } catch (UnknownHostException e) {
   Log.e(TAG, "192.168.155.1 is unkown server!");
   } catch (Exception e) {
   e.printStackTrace();
   } finally {
   try {
    socket.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
   }
 
  }
  
 };
 workThread = new Thread(backgroundWork);
 // isAlive方法用于判斷workThread線程是否被開啟
 if (!workThread.isAlive()) {
  // 生成新線程
  workThread.start();
  Log.v("ServiceLife", "線程開始工作");
 } else {
  Log.v("workThread", "線程已經被調用");
 }
 
 return START_STICKY;
 }
 
 @Override
 public void onDestroy() {
 
 super.onDestroy();
 // 利用interrupt方式中斷該線程
 isStop = true;
 
 Log.v("ServiceLife", "onDestroy方法被調用");
 }
 
}

5、最后別忘了注冊AndroidManifest.xml

?
1
2
3
4
5
6
7
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
 
<service android:name=".DownService" ></service>

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 男男同志gaysxxx | 操操久久 | 成人精品 | 2018天天拍拍拍免费视频 | 欧美最猛性xxxxx69交 | 精选国产AV精选一区二区三区 | 日本无吗免费一二区 | 第一次做m被调教经历 | 国产成人精品日本亚洲网址 | 日韩天堂网| 国产乱码免费卡1卡二卡3卡四 | 欧美另类亚洲 | 色99在线| 九九热在线视频 | 国产精品久久久久aaaa | 久久亚洲精品专区蓝色区 | 超级乱淫1 | 亚洲春黄在线观看 | 9191免费永久观看 | 99久久综合给久久精品 | 天天综合色网 | 成人在线视频在线观看 | 美女视频在线观看视频 | 韩日视频在线观看 | 国产成+人+亚洲+欧美综合 | 91频视| 香蕉人人超人人超碰超国产 | 91次元成年破解版 | 美女脱得一二净无内裤全身的照片 | ffyybb免费福利视频 | 国产精品久久久免费视频 | 脱了白丝校花的内裤猛烈进入 | 免费观看美景之屋 | 国产经典一区 | 成人啪啪漫画羞羞漫画www网站 | 成人aqq| 丝袜捆绑调教视频免费区 | 王淑兰与铁柱全文免费阅读 | 手机能看的黄色网站 | 俺去啦最新 | 国产福利兔女郎在线观看 |