(Android)JavaSocket编程,文件上传到服务器,客户端Android,服务器端J2SE_第1张图片

(Android)JavaSocket编程,文件上传到服务器,客户端Android,服务器端J2SE_第2张图片

SD卡中有encrypt.png文件

(Android)JavaSocket编程,文件上传到服务器,客户端Android,服务器端J2SE_第3张图片


在E盘可以看到,从模拟器SD卡中发送来的文件



服务器端代码,我这里是使用CMD命令演示的。服务端等待客户端连接,然后接收客户端的数据。包括文件名,大小,和文件数据。

import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class FileServer {private int port = 8821;private ServerSocket ss;private Socket socket;/** 数据输入流,读取来自网络的数据流 **/private DataInputStream dis;/** 数据输出流,将来自网络的数据流写入文件 **/private DataOutputStream dos;private String savePath = "E:\\";public void startServer() {// 已经传输的文件大小int passedlength = 0;// 文件总大小long length = 0;// 缓存大小int bufferSize = 8192;// 缓存byte[] buf = new byte[bufferSize];try {ss = new ServerSocket(port);socket = ss.accept();dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));} catch (IOException e) {e.printStackTrace();}try {// 将文件名字读取进来savePath += dis.readUTF();// 文件的长度读取进来(实际只是为了显示进度)length = dis.readLong();} catch (IOException e) {e.printStackTrace();}try {dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(savePath)));} catch (FileNotFoundException e) {e.printStackTrace();}while (true) {int read = 0;if (dis != null) {try {read = dis.read(buf);} catch (IOException e) {e.printStackTrace();}}passedlength += read;if (read == -1) {break;}// 下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比System.out.println("文件接收了" + (passedlength * 100 / length) + "%\n");try {dos.write(buf, 0, read);} catch (IOException e) {e.printStackTrace();}}if (dos != null) {try {dos.close();} catch (IOException e) {e.printStackTrace();}dos = null;}if (dis != null) {try {dis.close();} catch (IOException e) {e.printStackTrace();}dis = null;}if (socket != null) {try {socket.close();} catch (IOException e) {e.printStackTrace();}socket = null;}if (ss != null) {try {ss.close();} catch (IOException e) {e.printStackTrace();}ss = null;}System.out.println("接收完成,文件存为" + savePath + "\n");}public static void main(String[] args) {FileServer fileServer = new FileServer();fileServer.startServer();}}

Android端代码(客户端)
还是要记住在Manifest中添加网络访问权限

main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <TextView        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:textStyle="bold"        android:gravity="center"        android:text="文件上传测试" />    <Button        android:id="@+id/myButton"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="开始上传" /></LinearLayout>

文件操作类,主要是使用了里面的获取SD路径的函数

package com.zeph.android.fileclient;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import android.content.Context;import android.os.Environment;public class FileHelper {private Context context;/** SD卡是否存在 **/private boolean hasSD = false;/** SD卡的路径 **/private String SDPATH;/** 当前程序包的路径 **/private String FILESPATH;public FileHelper(Context context) {this.context = context;hasSD = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);SDPATH = Environment.getExternalStorageDirectory().getPath();FILESPATH = this.context.getFilesDir().getPath();}/** * 在SD卡上创建文件 *  * @throws IOException */public File createSDFile(String fileName) throws IOException {File file = new File(SDPATH + "//" + fileName);if (!file.exists()) {file.createNewFile();}return file;}/** * 删除SD卡上的文件 *  * @param fileName */public boolean deleteSDFile(String fileName) {File file = new File(SDPATH + "//" + fileName);if (file == null || !file.exists() || file.isDirectory())return false;return file.delete();}/** * 读取SD卡中文本文件 *  * @param fileName * @return */public String readSDFile(String fileName) {StringBuffer sb = new StringBuffer();File file = new File(SDPATH + "//" + fileName);try {FileInputStream fis = new FileInputStream(file);int c;while ((c = fis.read()) != -1) {sb.append((char) c);}fis.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return sb.toString();}public String getFILESPATH() {return FILESPATH;}public String getSDPATH() {return SDPATH;}public boolean hasSD() {return hasSD;}}

Activity类,里面的startClient函数完成文件传输到服务器 注意代码里面IP地址填写你自己的。

package com.zeph.android.fileclient;import java.io.BufferedInputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.net.Socket;import java.net.UnknownHostException;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class FileClientActivity extends Activity {private Socket socket;// 这里填写你的IP地址private String ip = "192.168.0.1";private int port = 8821;private DataInputStream dis;private DataOutputStream dos;private Button myButton;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);myButton = (Button) findViewById(R.id.myButton);myButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {new Thread() {public void run() {startClient("encrypt.png");}}.start();}});}public void startClient(String fileName) {FileHelper helper = new FileHelper(getApplicationContext());String filePath = helper.getSDPATH() + "//" + fileName;File file = new File(filePath);try {socket = new Socket(ip, port);dis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));dos = new DataOutputStream(socket.getOutputStream());} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}try {dos.writeUTF(file.getName());dos.flush();dos.writeLong((long) file.length());dos.flush();} catch (IOException e) {e.printStackTrace();}int bufferSize = 8192;byte[] buf = new byte[bufferSize];while (true) {int read = 0;if (dis != null) {try {read = dis.read(buf);} catch (IOException e) {e.printStackTrace();}}if (read == -1) {break;}try {dos.write(buf, 0, read);dos.flush();} catch (IOException e) {e.printStackTrace();}}try {dis.close();dos.close();socket.close();} catch (IOException e) {e.printStackTrace();}}}

更多相关文章

  1. 读取local.properties文件
  2. 开始Android,Android studio 中部分文件目录的含义与作用
  3. java搭建本地服务器,android客户端访问,tomcat配置详细步骤
  4. Android的编译时遇到 gcc: error trying to exec 'cc1plus': exe
  5. android java Socket多文件发送
  6. Android 交叉编译 Linux 可执行文件
  7. Android 工程中的 R.java 文件丢失后如何重新生成

随机推荐

  1. Android程序横竖屏切换
  2. 对比onSaveInstanceState和onRestoreInst
  3. Android(安卓)getIdentifier获取资源ID
  4. 关于LinearLayout布局中,子控件平分宽度
  5. android获取3G或wifi流量信息
  6. Android使用selector改变和文本框文字的
  7. TextView设置一行最多显示6个字是什么属
  8. java.lang.IllegalArgumentException: Se
  9. Launcher
  10. android各种声音类型级数设定及默认值