这是一个Android手机间文件传输的例子,两个手机同时装上此app,然后输入接收端的ip,选择文件,可以多选,点确定,就发送到另一个手机,一个简单快捷文件快传实例。可以直接运用到项目中。

下面是文件选择器:

代码

首先加入文件选择库

  1. compile 'com.nononsenseapps:filepicker:2.5.2'

这个库的地址和用法在:https://github.com/spacecowboy/NoNonsense-FilePicker

activity_main.xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context=".MainActivity" >
  10.  
  11. <TextView
  12. android:id="@+id/tvMsg"
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:layout_alignParentTop="true"
  16. android:focusable="false"
  17. android:focusableInTouchMode="false"
  18. android:text="TextView"
  19. android:textColor="#AAA" />
  20.  
  21. <EditText
  22. android:id="@+id/txtIP"
  23. android:layout_width="match_parent"
  24. android:layout_height="wrap_content"
  25. android:layout_below="@+id/tvMsg"
  26. android:layout_centerVertical="true"
  27. android:contentDescription="目标IP地址"
  28. android:ems=""
  29. android:text="192.168.1.100" />
  30.  
  31. <EditText
  32. android:id="@+id/txtPort"
  33. android:layout_width="match_parent"
  34. android:layout_height="wrap_content"
  35. android:layout_alignLeft="@+id/txtIP"
  36. android:layout_below="@+id/txtIP"
  37. android:ems=""
  38. android:text="" />
  39.  
  40. <EditText
  41. android:id="@+id/et"
  42. android:layout_width="match_parent"
  43. android:layout_height="180dp"
  44. android:layout_alignLeft="@+id/txtIP"
  45. android:layout_below="@+id/txtPort"
  46. android:clickable="false"
  47. android:editable="false"
  48. android:ems=""
  49. android:focusable="false"
  50. android:focusableInTouchMode="false"
  51. android:gravity="center_vertical|left|top"
  52. android:inputType="textMultiLine"
  53. android:longClickable="false"
  54. android:scrollbarAlwaysDrawVerticalTrack="true"
  55. android:scrollbarStyle="insideInset"
  56. android:scrollbars="vertical"
  57. android:textSize="15dp" >
  58.  
  59. <requestFocus />
  60. </EditText>
  61.  
  62. <Button
  63. android:id="@+id/btnSend"
  64. android:layout_width="match_parent"
  65. android:layout_height="wrap_content"
  66. android:layout_alignLeft="@+id/txtPort"
  67. android:layout_below="@+id/et"
  68. android:text="选择文件并发送" />
  69.  
  70. </RelativeLayout>

MainActivity.class

  1. public class MainActivity extends AppCompatActivity {
  2. private static final int FILE_CODE = ;
  3. private TextView tvMsg;
  4. private EditText txtIP, txtPort, txtEt;
  5. private Button btnSend;
  6. private Handler handler;
  7. private SocketManager socketManager;
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. tvMsg = (TextView)findViewById(R.id.tvMsg);
  13. txtIP = (EditText)findViewById(R.id.txtIP);
  14. txtPort = (EditText)findViewById(R.id.txtPort);
  15. txtEt = (EditText)findViewById(R.id.et);
  16. btnSend = (Button)findViewById(R.id.btnSend);
  17. btnSend.setOnClickListener(new View.OnClickListener(){
  18. @Override
  19. public void onClick(View v) {
  20. Intent i = new Intent(MainActivity.this, FilePickerActivity.class);
  21. i.putExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, true);
  22. i.putExtra(FilePickerActivity.EXTRA_ALLOW_CREATE_DIR, false);
  23. i.putExtra(FilePickerActivity.EXTRA_MODE, FilePickerActivity.MODE_FILE);
  24. i.putExtra(FilePickerActivity.EXTRA_START_PATH, Environment.getExternalStorageDirectory().getPath());
  25.  
  26. startActivityForResult(i, FILE_CODE);
  27. }
  28. });
  29. handler = new Handler(){
  30. @Override
  31. public void handleMessage(Message msg) {
  32. switch(msg.what){
  33. case :
  34. SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");
  35. txtEt.append("\n[" + format.format(new Date()) + "]" + msg.obj.toString());
  36. break;
  37. case :
  38. tvMsg.setText("本机IP:" + GetIpAddress() + " 监听端口:" + msg.obj.toString());
  39. break;
  40. case :
  41. Toast.makeText(getApplicationContext(), msg.obj.toString(), Toast.LENGTH_SHORT).show();
  42. break;
  43. }
  44. }
  45. };
  46. socketManager = new SocketManager(handler);
  47. }
  48.  
  49. @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
  50. @Override
  51. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  52. if (requestCode == FILE_CODE && resultCode == Activity.RESULT_OK) {
  53. final String ipAddress = txtIP.getText().toString();
  54. final int port = Integer.parseInt(txtPort.getText().toString());
  55. if (data.getBooleanExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, true)) {
  56. // For JellyBean and above
  57. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
  58. ClipData clip = data.getClipData();
  59. final ArrayList<String> fileNames = new ArrayList<>();
  60. final ArrayList<String> paths = new ArrayList<>();
  61. if (clip != null) {
  62. for (int i = ; i < clip.getItemCount(); i++) {
  63. Uri uri = clip.getItemAt(i).getUri();
  64. paths.add(uri.getPath());
  65. fileNames.add(uri.getLastPathSegment());
  66. }
  67. Message.obtain(handler, , "正在发送至" + ipAddress + ":" + port).sendToTarget();
  68. Thread sendThread = new Thread(new Runnable(){
  69. @Override
  70. public void run() {
  71. socketManager.SendFile(fileNames, paths, ipAddress, port);
  72. }
  73. });
  74. sendThread.start();
  75. }
  76. } else {
  77. final ArrayList<String> paths = data.getStringArrayListExtra
  78. (FilePickerActivity.EXTRA_PATHS);
  79. final ArrayList<String> fileNames = new ArrayList<>();
  80. if (paths != null) {
  81. for (String path: paths) {
  82. Uri uri = Uri.parse(path);
  83. paths.add(uri.getPath());
  84. fileNames.add(uri.getLastPathSegment());
  85. socketManager.SendFile(fileNames, paths, ipAddress, port);
  86. }
  87. Message.obtain(handler, , "正在发送至" + ipAddress + ":" + port).sendToTarget();
  88. Thread sendThread = new Thread(new Runnable(){
  89. @Override
  90. public void run() {
  91. socketManager.SendFile(fileNames, paths, ipAddress, port);
  92. }
  93. });
  94. sendThread.start();
  95. }
  96. }
  97.  
  98. }
  99. }
  100. }
  101.  
  102. @Override
  103. protected void onDestroy() {
  104. super.onDestroy();
  105. System.exit();
  106. }
  107. public String GetIpAddress() {
  108. WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
  109. WifiInfo wifiInfo = wifiManager.getConnectionInfo();
  110. int i = wifiInfo.getIpAddress();
  111. return (i & 0xFF) + "." +
  112. ((i >> ) & 0xFF) + "." +
  113. ((i >> ) & 0xFF)+ "." +
  114. ((i >> ) & 0xFF );
  115. }
  116. }

SocketManager.class

  1. public class SocketManager {
  2. private ServerSocket server;
  3. private Handler handler = null;
  4. public SocketManager(Handler handler){
  5. this.handler = handler;
  6. int port = ;
  7. while(port > ){
  8. try {
  9. server = new ServerSocket(port);
  10. break;
  11. } catch (Exception e) {
  12. port--;
  13. }
  14. }
  15. SendMessage(, port);
  16. Thread receiveFileThread = new Thread(new Runnable(){
  17. @Override
  18. public void run() {
  19. while(true){
  20. ReceiveFile();
  21. }
  22. }
  23. });
  24. receiveFileThread.start();
  25. }
  26. void SendMessage(int what, Object obj){
  27. if (handler != null){
  28. Message.obtain(handler, what, obj).sendToTarget();
  29. }
  30. }
  31.  
  32. void ReceiveFile(){
  33. try{
  34.  
  35. Socket name = server.accept();
  36. InputStream nameStream = name.getInputStream();
  37. InputStreamReader streamReader = new InputStreamReader(nameStream);
  38. BufferedReader br = new BufferedReader(streamReader);
  39. String fileName = br.readLine();
  40. br.close();
  41. streamReader.close();
  42. nameStream.close();
  43. name.close();
  44. SendMessage(, "正在接收:" + fileName);
  45.  
  46. Socket data = server.accept();
  47. InputStream dataStream = data.getInputStream();
  48. String savePath = Environment.getExternalStorageDirectory().getPath() + "/" + fileName;
  49. FileOutputStream file = new FileOutputStream(savePath, false);
  50. byte[] buffer = new byte[];
  51. int size = -;
  52. while ((size = dataStream.read(buffer)) != -){
  53. file.write(buffer, ,size);
  54. }
  55. file.close();
  56. dataStream.close();
  57. data.close();
  58. SendMessage(, fileName + "接收完成");
  59. }catch(Exception e){
  60. SendMessage(, "接收错误:\n" + e.getMessage());
  61. }
  62. }
  63. public void SendFile(ArrayList<String> fileName, ArrayList<String> path, String ipAddress, int port){
  64. try {
  65. for (int i = ; i < fileName.size(); i++){
  66. Socket name = new Socket(ipAddress, port);
  67. OutputStream outputName = name.getOutputStream();
  68. OutputStreamWriter outputWriter = new OutputStreamWriter(outputName);
  69. BufferedWriter bwName = new BufferedWriter(outputWriter);
  70. bwName.write(fileName.get(i));
  71. bwName.close();
  72. outputWriter.close();
  73. outputName.close();
  74. name.close();
  75. SendMessage(, "正在发送" + fileName.get(i));
  76.  
  77. Socket data = new Socket(ipAddress, port);
  78. OutputStream outputData = data.getOutputStream();
  79. FileInputStream fileInput = new FileInputStream(path.get(i));
  80. int size = -;
  81. byte[] buffer = new byte[];
  82. while((size = fileInput.read(buffer, , )) != -){
  83. outputData.write(buffer, , size);
  84. }
  85. outputData.close();
  86. fileInput.close();
  87. data.close();
  88. SendMessage(, fileName.get(i) + " 发送完成");
  89. }
  90. SendMessage(, "所有文件发送完成");
  91. } catch (Exception e) {
  92. SendMessage(, "发送错误:\n" + e.getMessage());
  93. }
  94. }
  95. }

以上就是全部代码。 
下载地址:点这里

Android手机间使用socket进行文件互传实例的更多相关文章

  1. find 以及linux 和windows 文件互传

    1. find  命令  查找文件或目录 同时也会用到的有 which   whereis   locate   经常也会遇到一些快捷键  ctrl  +  l  e  a  w  u  k     ...

  2. pscp使用详解 Windows与Linux文件互传工具

    pscp使用详解 Windows与Linux文件互传工具 pscp使用方法详解:pscp是putty安装包所带的远程文件传输工具,是一款十分常见windows与linux系统之间文件互传的工具,使用方 ...

  3. 【Linux】windows-linux、linux-linux文件互传

    一.Linux下文件互传,scp命令实例 1.Linux下目录复制:本机->远程服务器 scp -r /home/abc/test1(本机目录路径)  root@192.168.0.1:/hom ...

  4. Linux_window与linux之间文件互传,上传下载

    window与linux之间文件互传 运行环境:Centos os7 + win8.1 +putty putty:是一个Telnet,ssh,rlogin,纯tcp以及串行接口连接软件,由于linux ...

  5. linux学习(十)find命令、Linux文件后缀名、Linux和windows文件互传

    一.和find相关的几个搜索命令,了解即可. 1.1 which [root@iZ25lzba47vZ ~]# which ls alias ls='ls --color=auto' /usr/bin ...

  6. 虚拟机VMWare安装苹果系统MacOS详细教程(联网设置,全屏插件、文件互传)

    运行环境: VMware® Workstation 12 Pro(自行安装,或者用这个) 推荐(下面以10.11.6版本做的教程,但是安装时推荐使用此版本安装然后升级到10.11.6):MacOS X ...

  7. Ubuntu 和 Windows 之间进行远程访问和文件互传

    1. 利用 Ubuntu 自带软件 Remmina 对另一台 Ubuntu 电脑进行远程访问(同一局域网下) 假设要用 A 电脑来控制 B 电脑,首先需要在 B 电脑上进行桌面共享设置 .   然后打 ...

  8. Linux 与 Windows 文件互传(VMWare)

    虚拟机无桌面的Linux 与 物理机Windows 文件互传有很多种方法,现在先说一种通过共享文件夹的形式,其他方法后续再补充 1.     背景 1)        虚拟机系统:VMWare无桌面的 ...

  9. lrzsz——一款好用的文件互传工具

    日常开发中,经常需要在linux服务器和本地计算机(Windows或者Mac)两者之间传输文件,这时候就需要用到文件传输工具了. 最近偶然发现一款很好用的文件互传工具: lrzsz .墙裂推荐,好用指 ...

随机推荐

  1. poj3169 差分约束系统

    题意: 从1到n,n个数,从左向右依次排列. 给定两种形式的约束条件: 1.xi与yi的最大距离为dk 2.xi与yi的最小距离为dk 问满足这些限定条件的情况下,数1和n的最大距离是多少?(若约束条 ...

  2. 智课雅思词汇---四、clos和cap和ced是什么意思

    智课雅思词汇---四.clos和cap和ced是什么意思 一.总结 一句话总结: cap/capt/cip/cep/ceiv:to take,seize(拿,抓住) cede:to go,yield( ...

  3. UESTC 1584

    http://acm.uestc.edu.cn/#/problem/show/1584 Washi与Sonochi的约定 Time Limit: 3000/1000MS (Java/Others)   ...

  4. 清空/var/adm/wtmp 文件内容

    清/var/adm/wtmp 文件内容 用于显示登录系统和重启机器的情况 /var/adm/wtmp文件过大. 可用du -sm /var/adm/wtmp查看 cat /dev/null>/v ...

  5. js预编译和函数执行

    javascript 执行过程 1.语法检测(有没有基本的语法错误,例如中文,关键字错误...)2.词法分析(预编译) (1)创建全局GO(global object)对象 (2)对var声明的变量进 ...

  6. 现实人脸识别性别之路----弄清楚train_test_split函数

    '''train_test_split(trian_data,trian_target,test_size,random_state)各个参数表示的意义:trian_data表示被划分的样本特征集tr ...

  7. 【Redis哨兵集群】

    目录 开始配置主从复制 开始配置Redis Sentinel @ *** 在开始之前,我们先来看看Redis的主从复制 主从复制原理: 从服务器向主服务器发送SYNC命令. 主服务器接到SYNC命令后 ...

  8. pip-window安装

    windows 安装: 保证计算机联网直接使用cmd 执行 python -m pip install -U pip 自动安装 找到 python安装的路径 C:\Users\Administrato ...

  9. Swift学习笔记(2)--元组(Tuples)、Optional(可选值)、(Assertions)断言

    1.Tuples(元组) 元组是多个值组合而成的复合值.元组中的值可以是任意类型,而且每一个元素的类型可以是不同的. 1>定义:使用()包含所有元素,用逗号分开,也可以对每个元素做命名 let ...

  10. iOS8开发~Swift(五)Swift与OC混编

    一.概要 首先看<The Swift Programming Language>中提到"Swift's compatibility with Objective-C lets y ...