亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android TCP 文件客戶端與服務器DEMO介紹

2020-04-11 12:01:19
字體:
來源:轉載
供稿:網友

主要功能是:

1、TCP服務器提供文件下載服務,服務器支持多線程。

2、TCP Client從服務器上下載指定的文件,Client也支持多線程。

首先是服務器,服務器是在PC機上,JAVA運行環境,主要參考網上的代碼,自己做了支持多線程處理,代碼如下:

復制代碼 代碼如下:

//file:DownloadServer.java
import java.net.*;
import java.io.*;
class ServerOneDownload extends Thread {
    private Socket socket = null;
    private String downloadRoot = null;
    private static final int Buffer = 8 * 1024;
    public ServerOneDownload(Socket socket, String downloadRoot) {
        super();
        this.socket = socket;
        this.downloadRoot = downloadRoot;
        start();
    }
    // 檢查文件是否真實存在,核對下載密碼,若文件不存在或密碼錯誤,則返回-1,否則返回文件長度
    // 此處只要密碼不為空就認為是正確的
    private long getFileLength(String fileName, String password) {
        // 若文件名或密碼為null,則返回-1
        if ((fileName == null) || (password == null))
            return -1;
        // 若文件名或密碼長度為0,則返回-1
        if ((fileName.length() == 0) || (password.length() == 0))
            return -1;
        String filePath = downloadRoot + fileName; // 生成完整文件路徑
        System.out.println("DownloadServer getFileLength----->" + filePath);
        File file = new File(filePath);
        // 若文件不存在,則返回-1
        if (!file.exists())
            return -1;
        return file.length(); // 返回文件長度
    }
    // 用指定輸出流發送指定文件
    private void sendFile(DataOutputStream out, String fileName)
            throws Exception {
        String filePath = downloadRoot + fileName; // 生成完整文件路徑
        // 創建與該文件關聯的文件輸入流
        FileInputStream in = new FileInputStream(filePath);
        System.out.println("DownloadServer sendFile----->" + filePath);
        byte[] buf = new byte[Buffer];
        int len;
        // 反復讀取該文件中的內容,直到讀到的長度為-1
        while ((len = in.read(buf)) >= 0) {
            out.write(buf, 0, len); // 將讀到的數據,按讀到的長度寫入輸出流
            out.flush();
        }
        out.close();
        in.close();
    }
    // 提供下載服務
    public void download() throws IOException {
        System.out.println("啟動下載... ");
        System.out.println("DownloadServer currentThread--->"
                + currentThread().getName());
        System.out.println("DownloadServer currentThread--->"
                + currentThread().getId());
        // 獲取socket的輸入流并包裝成BufferedReader
        BufferedReader in = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));
        // 獲取socket的輸出流并包裝成DataOutputStream
        DataOutputStream out = new DataOutputStream(socket.getOutputStream());
        try {
            String parameterString = in.readLine(); // 接收下載請求參數
            // 下載請求參數字符串為自定義的格式,由下載文件相對于下載根目錄的路徑和
            // 下載密碼組成,兩者間以字符 "@ "分隔,此處按 "@ "分割下載請求參數字符串
            String[] parameter = parameterString.split("@ ");
            String fileName = parameter[0]; // 獲取相對文件路徑
            String password = parameter[1]; // 獲取下載密碼
            // 打印請求下載相關信息
            System.out.print(socket.getInetAddress().getHostAddress()
                    + "提出下載請求, ");
            System.out.println("請求下載文件: " + fileName);
            // 檢查文件是否真實存在,核對下載密碼,獲取文件長度
            long len = getFileLength(fileName, password);
            System.out.println("download fileName----->" + fileName);
            System.out.println("download password----->" + password);
            out.writeLong(len); // 向客戶端返回文件大小
            out.flush();
            // 若獲取的文件長度大于等于0,則允許下載,否則拒絕下載
            if (len >= 0) {
                System.out.println("允許下載 ");
                System.out.println("正在下載文件 " + fileName + "... ");
                sendFile(out, fileName); // 向客戶端發送文件
                System.out.println(fileName +": "+"下載完畢 ");
            } else {
                System.out.println("下載文件不存在或密碼錯誤,拒絕下載! ");
            }
        } catch (Exception e) {
            System.out.println(e.toString());
        } finally {
            socket.close(); // 關閉socket
        }
    }
    @Override
    public void run() {
        try {
            download();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // TODO Auto-generated method stub
        super.run();
    }
}
public class DownloadServer {
    private final static int port = 65525;
    private static String root = "C:// "; // 下載根目錄
    public static void main(String[] args) throws IOException {
        String temp = null;
        // 監聽端口
        try {
            // 包裝標準輸入為BufferedReader
            BufferedReader systemIn = new BufferedReader(new InputStreamReader(
                    System.in));
            while (true) {
                System.out.print("請輸入下載服務器的下載根目錄: ");
                root = systemIn.readLine().trim(); // 從標準輸入讀取下載根目錄
                File file = new File(root);
                // 若該目錄確實存在且為目錄,則跳出循環
                if ((file.exists()) && (file.isDirectory())) {
                    temp = root.substring(root.length() - 1, root.length());
                    if (!temp.equals("http://"))
                        root += "http://";
                }
                break;
            }
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        ServerSocket serverSocket = new ServerSocket(port);
        System.out.println("Server start...");
        try {
            while (true) {
                Socket socket = serverSocket.accept();
                new ServerOneDownload(socket, root);
            }
        } finally {
            serverSocket.close();
        }
    }
}

File Download Client

Client輸入IP和文件名即可直接從服務器上下載,還是看代碼。

復制代碼 代碼如下:

//file:DownLoadClient.java
package org.piaozhiye.study;
import java.io.IOException;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class DownLoadClient extends Activity {
    private Button download = null;
    private EditText et_serverIP = null;
    private EditText et_fileName= null;
    private String downloadFile = null;
    private final static int PORT = 65525;
    private final static String defaultIP = "192.168.0.100";
    private static String serverIP = null;
    private Socket socket;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        download = (Button)findViewById(R.id.download);
        et_serverIP= (EditText)findViewById(R.id.et_serverip);
        et_fileName = (EditText)findViewById(R.id.et_filename);
        et_serverIP.setText("192.168.0.100");

      download.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                 serverIP = et_serverIP.getText().toString();
                 if(serverIP == null){
                     serverIP = defaultIP;
                 }
                 System.out.println("DownLoadClient serverIP--->" + serverIP );
                    System.out.println("DownLoadClient MainThread--->" + Thread.currentThread().getId() );

                try{
                    socket = new Socket(serverIP, PORT);

                }catch(IOException e){

                }
                 downloadFile = et_fileName.getText().toString();
            Thread downFileThread = new Thread(new DownFileThread(socket, downloadFile));
            downFileThread.start();
                System.out.println("DownLoadClient downloadFile--->" + downloadFile );
            }
        });

    }
}

file:DownFileThread.java
復制代碼 代碼如下:

package org.piaozhiye.study;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class DownFileThread extends Thread {
    private Socket socket;
    private String downloadFile;
    private final static int Buffer = 8 * 1024;
    public DownFileThread(Socket socket, String downloadFile) {
        super();
        this.socket = socket;
        this.downloadFile = downloadFile;
    }
    public Socket getSocket() {
        return socket;
    }
    public void setSocket(Socket socket) {
        this.socket = socket;
    }
    public String getDownloadFile() {
        return downloadFile;
    }
    public void setDownloadFile(String downloadFile) {
        this.downloadFile = downloadFile;
    }
    // 向服務器提出下載請求,返回下載文件的大小
    private long request(String fileName, String password) throws IOException {
        // 獲取socket的輸入流并包裝成DataInputStream
        DataInputStream in = new DataInputStream(socket.getInputStream());
        // 獲取socket的輸出流并包裝成PrintWriter
        PrintWriter out = new PrintWriter(new OutputStreamWriter(
                socket.getOutputStream()));
        // 生成下載請求字符串
        String requestString = fileName + "@ " + password;
        out.println(requestString); // 發出下載請求
        out.flush();
        return in.readLong(); // 接收并返回下載文件長度
    }
    // 接收并保存文件
    private void receiveFile(String localFile) throws Exception {
        // 獲取socket的輸入流并包裝成BufferedInputStream
        BufferedInputStream in = new BufferedInputStream(
                socket.getInputStream());
        // 獲取與指定本地文件關聯的文件輸出流
        FileOutputStream out = new FileOutputStream(localFile);
        byte[] buf = new byte[Buffer];
        int len;
        // 反復讀取該文件中的內容,直到讀到的長度為-1
        while ((len = in.read(buf)) >= 0) {
            out.write(buf, 0, len); // 將讀到的數據,按讀到的長度寫入輸出流
            out.flush();
        }
        out.close();
        in.close();
    }
    // 從服務器下載文件
    public void download(String downloadFile) throws Exception {
        try {
            String password = "password";
            // String downloadFile ="imissyou.mp3";
            String localpath = "/sdcard/";
            String localFile = localpath + downloadFile;
            long fileLength = request(downloadFile, password);
            // 若獲取的文件長度大于等于0,說明允許下載,否則說明拒絕下載
            if (fileLength >= 0) {
                System.out.println("fileLength: " + fileLength + " B");
                System.out.println("downing...");
                receiveFile(localFile); // 從服務器接收文件并保存至本地文件
                System.out.println("file:" + downloadFile + " had save to "
                        + localFile);
            } else {
                System.out.println("download " + downloadFile + " error! ");
            }
        } catch (IOException e) {
            System.out.println(e.toString());
        } finally {
            socket.close(); // 關閉socket
        }
    }
    @Override
    public void run() {
        System.out.println("DownFileThread currentThread--->"
                + DownFileThread.currentThread().getId());
        // TODO Auto-generated method stub
        try {
            download(downloadFile);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        super.run();
    }

}

layout.xml
復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:text="服務器IP:"
    />
    <EditText
    android:id="@+id/et_serverip"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"

    />

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:text="下載文件名:"
    />
    <EditText
    android:id="@+id/et_filename"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"

    />
    <Button
    android:id="@+id/download"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="download"
    />
</LinearLayout>

同時別忘了權限:

<uses-permission android:name="android.permission.INTERNET" />

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲美女福利视频网站| 国产精品福利在线观看| 98视频在线噜噜噜国产| 亚洲欧美三级在线| 国产精品视频一| 国产精品mp4| 欧美电影电视剧在线观看| 日韩美女av在线| 国产精品日韩欧美综合| 2025国产精品视频| 日本道色综合久久影院| 伊人久久综合97精品| 尤物精品国产第一福利三区| 国产精品视频免费观看www| 国产精品视频播放| 色天天综合狠狠色| 2018中文字幕一区二区三区| 亚洲人成网站999久久久综合| 日韩男女性生活视频| 亚洲欧美综合v| 欧美大片欧美激情性色a∨久久| 成人网页在线免费观看| xxxxx91麻豆| 岛国精品视频在线播放| 国产一区二区三区在线观看视频| 精品视频一区在线视频| 日韩av影片在线观看| 日韩黄色高清视频| 久久精品国产精品亚洲| 欧美在线影院在线视频| 91国产精品视频在线| 7m精品福利视频导航| 亚洲精品国产精品国产自| 欧美大片在线免费观看| 午夜精品久久久久久99热| 国产视频精品免费播放| 国产xxx69麻豆国语对白| 日韩成人高清在线| 久久久久亚洲精品成人网小说| 亚洲男人的天堂在线| 亚洲免费电影在线观看| 91在线网站视频| 美日韩精品视频免费看| 日韩精品视频三区| 在线电影欧美日韩一区二区私密| 97精品在线观看| 亚洲人成电影网站色| 欧美日韩国产麻豆| 午夜欧美不卡精品aaaaa| 高清视频欧美一级| 亚洲第一精品夜夜躁人人躁| 亚洲黄在线观看| 精品丝袜一区二区三区| 在线性视频日韩欧美| 国产精品视频99| 精品少妇v888av| 成人免费直播live| 欧美性猛交99久久久久99按摩| 亚洲精品一区中文| 国产精品狠色婷| 久久国内精品一国内精品| 欧美极品xxxx| 精品久久久久久久久中文字幕| 91精品国产免费久久久久久| 久久精品国产欧美激情| 亚洲精品有码在线| 亚洲片av在线| 精品国产区一区二区三区在线观看| 欧美大荫蒂xxx| 久久99国产精品久久久久久久久| 欧美精品国产精品日韩精品| 亚洲免费视频网站| 欧美在线视频在线播放完整版免费观看| 欧美激情日韩图片| 国产综合在线看| 另类专区欧美制服同性| 欧美激情视频一区二区三区不卡| 欧美成年人视频网站欧美| 欧美在线亚洲一区| 中文在线不卡视频| 国产色视频一区| 日韩av影片在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 久久久久久网址| 亚洲精品电影网在线观看| 国产欧美精品一区二区三区介绍| 欧美影院在线播放| 亚洲自拍偷拍区| 在线观看欧美视频| 日韩精品视频免费| 成人免费视频网| 亚洲国产欧美日韩精品| 欧美日韩国产123| 欧美性xxxx极品高清hd直播| 国产色综合天天综合网| 日韩在线观看免费| 91成人在线播放| 在线看片第一页欧美| xxxxxxxxx欧美| 成人黄色免费网站在线观看| 欧美精品在线观看91| 日韩亚洲第一页| 久久亚洲精品毛片| 亚洲黄色www| 亚洲欧美资源在线| 麻豆国产精品va在线观看不卡| 国产精品久久久久久网站| 亚洲精品国精品久久99热一| 国产在线999| 欧美激情精品久久久久久久变态| 91精品中文在线| 91精品国产91久久久久久久久| 亚洲视频在线观看网站| 一本大道久久加勒比香蕉| 色老头一区二区三区在线观看| 色综合天天综合网国产成人网| 亚洲成成品网站| 国产精品日韩av| 国产精品6699| 法国裸体一区二区| 欧美人成在线视频| 日韩高清免费观看| 热re99久久精品国产66热| 亚洲欧美中文字幕在线一区| 热re91久久精品国99热蜜臀| 国产中文日韩欧美| 91精品久久久久久久久青青| 欧美精品成人91久久久久久久| 色综合导航网站| 色多多国产成人永久免费网站| 欧美午夜激情小视频| xxx一区二区| 91色视频在线导航| 国内精品中文字幕| 久久久久中文字幕2018| 精品色蜜蜜精品视频在线观看| 久久在线视频在线| 福利视频导航一区| 欧美极品在线视频| 97av在线视频免费播放| 久久国产精品影视| 欧美精品成人在线| 欧美成人精品三级在线观看| 中文字幕在线视频日韩| 国产精品户外野外| 亚洲一区亚洲二区| 国产成人精品a视频一区www| 亚洲成人亚洲激情| 欧洲成人免费视频| 国产成人欧美在线观看| 欧美日韩福利视频| 欧美精品中文字幕一区| 精品露脸国产偷人在视频| 日韩风俗一区 二区| 久久国产加勒比精品无码| 中文字幕日韩欧美在线视频| 亚洲人成电影在线| 欧美中文字幕在线| 国产偷国产偷亚洲清高网站| 亚洲国产美女精品久久久久∴| 在线精品视频视频中文字幕| 亚洲视频一区二区| 欧美电影免费观看| 午夜精品久久久久久99热|