Android TCP 文件客户端与服务器DEMO介绍

主要功能是:

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("//"))
                        root += "//";
                }
                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" />

(0)

相关推荐

  • Android中实现TCP和UDP传输实例

    TCP和UDP在网络传输中非常重要,在Android开发中同样重要. 首先我们来看一下什么是TCP和UDP. 什么是TCP? TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的.可靠的.基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified).在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能.应用层向TCP层发送用于网间传输的.用8位字节表示的数据流,然后TCP

  • android的UDP编程实例

    一.有的手机不能直接接收UDP包,可能是手机厂商在定制Rom的时候把这个功能给关掉了.1.可先在oncreate()方法里面实例化一个WifiManager.MulticastLock 对象lock:具体如下: 复制代码 代码如下: WifiManager manager = (WifiManager) this                .getSystemService(Context.WIFI_SERVICE);WifiManager.MulticastLock lock= manag

  • Android编程使用HTTP协议与TCP协议实现上传文件的方法

    本文实例讲述了Android编程使用HTTP协议与TCP协议实现上传文件的方法.分享给大家供大家参考,具体如下: Android上传文件有两种方式,第一种是基于Http协议的HttpURLConnection,第二种是基于TCP协议的Socket. 这两种方式的区别是使用HttpURLConnection上传时内部有缓存机制,如果上传较大文件会导致内存溢出.如果用TCP协议Socket方式上传就会解决这种弊端. HTTP协议HttpURLConnection 1. 通过URL封装路径打开一个Ht

  • Android网络编程之UDP通信模型实例

    什么是Android UDP? UDP是User Datagram Protocol的简称,中文名是用户数据包协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务.它是IETF RFC 768是UDP的正式规范.在网络中它与TCP协议一样用于处理数据包.在OSI模型中,在第四层-传输层,处于IP协议的上一层.UDP有不提供数据报分组.组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的.UDP用来支持那些需要在计算机之间传输数据

  • Android使用socket创建简单TCP连接的方法

    本文实例讲述了Android使用socket创建简单TCP连接的方法.分享给大家供大家参考,具体如下: 不管是在Java还是Android编程中,通信都是及其重要的一部分.有连接的socket编程,重要性自然毋庸置疑. 这里以一个简单的demo演示一个最基本的socket编程. 先写服务端.服务端是Java代码.笔者懒得装eclipse等编程软件,就是直接notepad编程,dos运行的.服务端一般是新建一个绑定端口的serversocket,监听客户端请求(死循环监听).当接收到客户端消息时,

  • Android实现TCP客户端接收数据的方法

    本文实例讲述了Android实现TCP客户端接收数据的方法.分享给大家供大家参考,具体如下: 配合log4net使用,用来接收调试信息.因此,此客户端只管通过TCP接收字符串数据,然后显示在界面上. 接收TCP数据 try { Socket s = new Socket("192.168.1.5", 8240); InputStream inputStream = s.getInputStream(); DataInputStream input = new DataInputStre

  • Android编程实现TCP客户端的方法

    本文实例讲述了Android编程实现TCP客户端的方法.分享给大家供大家参考,具体如下: 因为项目上需要实现一个TCP Client 端:在网上找好多例子基本上都是阻塞方式完成: 我的实现例子:由Activity 及sever 来实现,在sever 创建一个线程来监听接受数据.收到数据,通过广播发送给Activity; 服务端我没有去实现,你可以下载TCP Socket 调试工具v2.2:创建个9005端口:客户端:访问的IP为10.0.2.2 AnetTest.java: /** * Copy

  • Android下使用TCPDUMP实现数据抓包教程

    如果想分析Android下 某个APP的网络数据交互,需要在Android手机上抓包,最常用的抓包工具非tcpdump莫属,用tcpdump生成Wireshark识别的 pcap文件,然后将pcap文件下载到电脑上,用电脑上的Wireshark加载pcap文件,通过Wireshark分析tcpdump抓取的数据. 一.安装tcpdump 为Android手机安装tcpdump,首先必须将Android手机root,现在市面上常用的root工具都很傻瓜很强大,推荐使用root精灵,将手机root以

  • Android实现TCP断点上传 后台C#服务接收

    终端实现大文件上传一直都是比较难的技术,其中涉及到后端与前端的交互,稳定性和流量大小,而且实现原理每个人都有自己的想法,后端主流用的比较多的是Http来实现,因为大多实现过断点下载.但稳定性不能保证,一旦断开,无法续传.所以得采用另一种流行的做法,TCP上传大文件. 网上查找了一些资料,大多数是断点下载,然后就是单独的C#端的上传接收,或是HTTP的,或是只有android端的,由于任务紧所以之前找的首选方案当然是Http先来实现文件上传,终端采用Post方法,将文件直接传至后端,后端通过Fil

  • Android编程实现TCP、UDP客户端通信功能示例

    本文实例讲述了Android编程实现TCP.UDP客户端通信功能.分享给大家供大家参考,具体如下: 在进行Android开发的过程中,免不了,要开发TCP/UDP通讯的程序,下面这两段代码,分别介绍了TCP/UCP通过的一个实例: 代码一 TCP通讯: private void tcpdata() { try { Socket s = new Socket("192.168.0.25", 65500); // outgoing stream redirect to socket Out

  • Android中使用tcpdump、wireshark进行抓包并分析技术介绍

    本文主要介绍如何使用tcpdump和wireshark对Android应用程序进行抓包并分析,需要说明的是在抓包之前,你的Android设备必须root过了,另外你的电脑必须有Android SDK环境. 下载并安装tcpdump tcpdump链接:http://www.tcpdump.org/ 选择一个版本下载并解压提取出其中呃tcpdump文件,然后push到你的手机上去: 复制代码 代码如下: adb push c:\tcpdump /data/local/tcpdump 进一步操作:

随机推荐