Android 用Socket实现PC和手机的文件传输
PC服务器端代码:
- /*
- * PC与<a href="http://lib.csdn.net/base/android" class='replace_word' title="Android知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Android</a>客户端实现文件的传送
- * PC服务器端
- */
- package com.<a href="http://lib.csdn.net/base/android" class='replace_word' title="Android知识库" target='_blank' style='color:#df3434; font-weight:bold;'>android</a>.test;
- import <a href="http://lib.csdn.net/base/java" class='replace_word' title="Java 知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Java</a>.io.BufferedInputStream;
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java<a href="http://lib.csdn.net/base/dotnet" class='replace_word' title=".NET知识库" target='_blank' style='color:#df3434; font-weight:bold;'>.NET</a>.ServerSocket;
- import java<a href="http://lib.csdn.net/base/dotnet" class='replace_word' title=".NET知识库" target='_blank' style='color:#df3434; font-weight:bold;'>.net</a>.Socket;
- public class TransferFileServer {
- private static final int HOST_PORT = ;
- private void start() {
- Socket s = null;
- try {
- ServerSocket ss = new ServerSocket(HOST_PORT);
- while (true) {
- String filePath = "/home/fan/Pictures/1.jpg";
- File file = new File(filePath);
- System.out.println("文件长度:" + (int) file.length());
- s = ss.accept();
- log("建立Socket连接");
- DataInputStream dis = new DataInputStream(
- new BufferedInputStream(s.getInputStream()));
- dis.readByte();
- DataInputStream fis = new DataInputStream(
- new BufferedInputStream(new FileInputStream(filePath)));
- DataOutputStream dos = new DataOutputStream(s.getOutputStream());
- dos.writeUTF(file.getName());
- dos.flush();
- dos.writeLong((long) file.length());
- dos.flush();
- int bufferSize = ;
- byte[] buf = new byte[bufferSize];
- while (true) {
- int read = ;
- if (fis != null) {
- read = fis.read(buf);
- }
- if (read == -) {
- break;
- }
- dos.write(buf,,read);
- }
- dos.flush();
- // 注意关闭socket链接哦,不然客户端会等待server的数据过来,
- // 直到socket超时,导致数据不完整。
- fis.close();
- s.close();
- log("文件传输完成");
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- void log(String msg) {
- System.out.println(msg);
- }
- public static void main(String args[]) {
- new TransferFileServer().start();
- }
- }
ClientSocket:辅助类
- /*
- * PC与Android文件传输
- * Android客户端
- */
- package com.android.test;
- import java.io.BufferedInputStream;
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java<a href="http://lib.csdn.net/base/dotnet" class='replace_word' title=".NET知识库" target='_blank' style='color:#df3434; font-weight:bold;'>.Net</a>.Socket;
- import java.net.UnknownHostException;
- public class ClientSocket {
- private String ip;
- private int port;
- private Socket socket = null;
- DataOutputStream out = null;
- DataInputStream getMessageStream = null;
- public ClientSocket(String ip, int port) {
- this.ip = ip;
- this.port = port;
- }
- public void createConnection() {
- try {
- socket = new Socket(ip, port);
- } catch (UnknownHostException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- if (socket != null) {
- try {
- socket.close();
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- if (socket != null) {
- try {
- socket.close();
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- }
- } finally {
- }
- }
- public void sendMessage(String sendMessage) {
- try {
- out = new DataOutputStream(socket.getOutputStream());
- if (sendMessage.equals("Windows")) {
- out.writeByte(0x1);
- out.flush();
- return;
- }
- if (sendMessage.equals("Unix")) {
- out.writeByte(0x2);
- out.flush();
- return;
- }
- if (sendMessage.equals("<a href="http://lib.csdn.net/base/linux" class='replace_word' title="Linux知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Linux</a>")) {
- out.writeByte(0x3);
- out.flush();
- } else {
- out.writeUTF(sendMessage);
- out.flush();
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- if (out != null) {
- try {
- out.close();
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- }
- }
- }
- public DataInputStream getMessageStream() {
- try {
- getMessageStream = new DataInputStream(new BufferedInputStream(
- socket.getInputStream()));
- // return getMessageStream;
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- if (getMessageStream != null) {
- try {
- getMessageStream.close();
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- }
- }
- return getMessageStream;
- }
- public void shutDownConnection() {
- try {
- if (out != null) {
- out.close();
- }
- if (getMessageStream != null) {
- getMessageStream.close();
- }
- if (socket != null) {
- socket.close();
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
Android客户端:Acitivyt实现:
- package com.android.test;
- import java.io.BufferedOutputStream;
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class Main extends Activity implements OnClickListener{
- private ClientSocket cs = null;
- private static final String FILE_PATH = "/mnt/sdcard/";
- private String ip = "192.168.1.103";
- private int port = ;
- private String sendMessage = "<a href="http://lib.csdn.net/base/linux" class='replace_word' title="Linux知识库" target='_blank' style='color:#df3434; font-weight:bold;'>linux</a>";
- private Button mButton;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mButton = (Button)findViewById(R.id.start);
- mButton.setOnClickListener(this);
- }
- private void start() {
- if (createConnection()) {
- sendMessage();
- getMessage();
- }
- }
- private void getMessage() {
- if (cs == null)
- return;
- DataInputStream inputStream = null;
- inputStream = cs.getMessageStream();
- try {
- String savePath = FILE_PATH;
- int bufferSize = ;
- byte[] buf = new byte[bufferSize];
- int passedlen = ;
- long len = ;
- savePath += inputStream.readUTF();
- Log.d("AndroidClient","@@@savePath"+savePath);
- DataOutputStream fileOut = new DataOutputStream(
- new BufferedOutputStream(new BufferedOutputStream(
- new FileOutputStream(savePath))));
- len = inputStream.readLong();
- Log.d("AndoridClient","文件的长度为:"+len);
- Log.d("AndroidClient","开始接收文件");
- while(true) {
- int read = ;
- if (inputStream != null) {
- read = inputStream.read(buf);
- }
- passedlen += read;
- if (read == -) {
- break;
- }
- Log.d("AndroidClient","文件接收了"+(passedlen*/len)+"%/n");
- fileOut.write(buf,,read);
- }
- Log.d("AndroidClient","@@@文件接收完成"+savePath);
- fileOut.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- private void sendMessage() {
- if (cs == null)
- return;
- cs.sendMessage(sendMessage);
- }
- private boolean createConnection() {
- cs = new ClientSocket(ip, port);
- cs.createConnection();
- Log.d("Main", "连接服务器成功:");
- return true;
- }
- public void onClick(View v) {
- start();
- }
- }
Android 用Socket实现PC和手机的文件传输的更多相关文章
- python+socket实现网络信息交互及文件传输
Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket又称"套接字",应用程序通常通过"套接字" ...
- android adb命令,向开发手机添加文件
adb文档 把本地文件发送到调试手机 C:\Users\ajanuw>adb push C:\Users\ajanuw\Music\j.mp3 /storage/emulated/0/Downl ...
- 非堵塞socket实现android手机与PC的文件传输
项目须要是通过WIFI建立手机和PC的通信,然后自己定义一个简单的协议对要传输的文件进行校验,传输的文件是2张3M的图片,要求考虑网络中断情况处理. 我这里採用的是非堵塞socket来实现的,之前查过 ...
- Android Socket连接PC出错问题及解决
最近测试问题:Android 通过Socket链接电脑,ip和端口都是正确的,也在同一网段,可android端就是报异常如下: 解决办法:测试电脑的防火墙可能开着,在控制面板把防火墙打开即可.
- Appium 连手机失败Error: Android bootstrap socket crashed: Error: getaddrinfo ENOTFOUND localhost undefined:4724
问题:Appium执行,连接手机报下面的错误 Error: Android bootstrap socket crashed: Error: getaddrinfo ENOTFOUND localho ...
- android视频录制、另一部手机实时观看方案
最近调研android视频录制.另一部手机实时观看,大致有以下几种思路. 1. android手机充当服务器,使用NanoHTTPD充当服务器,另一部手机或者pc通过输入http://手机的ip:80 ...
- Android之socket多线程(二)
使用ServerSocket创建服务器端: public static void main(String[] args) throws IOException { // TODO Auto-gener ...
- Nginx配置网站适配PC和手机
考虑到网站的在多种设备下的兼容性,有很多网站会有手机版和电脑版两个版本.访问同一个网站URL,当服务端识别出用户使用电脑访问,就打开电脑版的页面,用户如果使用手机访问,则会得到手机版的页面. 1.判断 ...
- 【转】Nginx区分PC或手机访问不同网站
原文链接:http://www.nginx.cn/784.html 近几年来,随着手机和pad的普及,越来越多的用户选择使用移动客户端访问网站,而为了获取更好的用户体验,就需要针对不同的设备显示出最合 ...
随机推荐
- Android带索引联系人列表
网上Android联系人列表的样例也非常多,都和微信的联系人差点儿相同,因为项目用到了联系人列表索引功能(产品把字母item给去掉了),只是也还是好实现.这里我也来分享分享我的实现,免得以后忘了.那先 ...
- jquery 表单重置通用方法
$("#form_id").find(":input").not(":button,:submit,:reset,:hidden").val ...
- quartz 持久化 数据库表
此处只包括配置数据库操作 quartz 持久化数据库表格字段解释建表,SQL语句在dbTables文件夹中可以找到,介绍下我们开发主要使用到的表: (版本不一样,可能数据库表也不一样,这里使用2.2. ...
- Chromium Graphics: HW Video Acceleration in Chrom{e,ium}{,OS}
HW Video Acceleration in Chrom{e,ium}{,OS} Ami Fischman <fischman@chromium.org> Status as of 2 ...
- Tensorflow 学习笔记 -----gradient
Tensorflow 的求梯度函数: [db, dW, dx] = tf.gradient(C, [b, w, x]) 在调试时用处较大. 实例: import tensorflow as tf im ...
- 页面打开pdf格式文件的方法
<embed width=500 height=300 fullscreen=yes src="1.pdf" />
- 错误:created a ThreadLocal with key of type ……but failed to remove it when the web application was stopped. This is very likely to create a memory leak.
tomcat reload显示错误:SEVERE: The web application [/Interceptor] created a ThreadLocal with key of type ...
- UVa 10101 - Bangla Numbers
题目:将数字数转化成数字加单词的表示形式输出. 分析:数论.简单题.直接分成两部分除10000000的商和余数,分别输出就可以. 说明:注意输入为数字0的情况,还有long long类型防止溢出. # ...
- final使用方法
final的作用随着所修饰的类型而不同 1.final修饰类中的属性或者变量 不管属性是基本类型还是引用类型.final所起的作用都是变量里面存放的"值"不能变. 这个值,对 ...
- 如何实现对网站页面访问量的统计(javaweb和php)
如何实现对网站页面访问量的统计(javaweb和php) 一.总结 一句话总结:其实很简单啦,每访问一次那个页面对应的index函数(控制器中的那个函数)访问次数就加1就可以了. 1.javaweb中 ...