从服务器 (PC 端 ) 发送图片到客户端 (android 手机端 ) [转]

从服务器 (PC 端 ) 发送图片到客户端 (android 手机端 ) ,并在手机页面上显示该图片。(注:本文旨在实现功能,并未考虑效率,有待后续跟进。)

1、服务器端


 1 int port=9090;
2
3
4 /**
5 * 发送文件的方法
6 * 此处定义服务器端口为9090,ip地址为192.168.1.1
7 * 设定被传输图片的路径为"images/icon.png"
8 * images文件夹放在此工程的根目录下,我们就可以通过相对路径访问这个图片文件了
9 */
10
11
12 private void sendPic() {
13
14 try {
15
16 // 创建服务器
17 java.net.ServerSocket ss = new java.net.ServerSocket(port);
18 // 等待客户机接入,此处会阻塞,直到有客户机接入服务器
19 java.net.Socket client = ss.accept();
20 //创建将要被发送的图片的文件输入流
21 java.io.FileInputStream fin = new java.io.FileInputStream("images/icon.png");
22 //获得套接字的输出流,并包装成数据输出流
23 java.io.DataOutputStream dou = new java.io.DataOutputStream(client
24 .getOutputStream());
25 // 向输出流中写入文件数据长度
26 dou.writeInt(fin.available());//注:此处未考虑图片太大超出int范围,以至于出现内存溢出的情况
27 // 将实际的图片数据读取到byte[] data中
28 byte[] data = new byte[fin.available()];
29 fin.read(data);
30 // 将图片数据写入到输出流中
31 dou.write(data);
32 dou.flush();
33 } catch (IOException e) {
34 e.printStackTrace();
35 }
36
37
38 }

2 、 客户端(android手机)


 1 public class FrontPage extends android.app.Activity implements Runnable {
2
3 public void onCreate(android.os.Bundle savedInstanceState) {
4
5 super.onCreate(savedInstanceState);
6 setContentView(R.layout.frontpage);
7
8 // 启动读取套接字中数据并进行处理的线程
9  new Thread(this).start();// 本类继承了Runnable接口,所以创建线程时将本类的对象传入即可
10 }
11
12 String ip = "192.168.1.1";
13 int port = 9090;
14 android.widget.ImageView image;// 用于显示接收到的图片的ImageView对象
15
16 /**
17 * 由于输入流的read方法会阻塞,为了避免它影响主界面的其他数据处理, 启动一个线程来读取输入流中的数据,并对数据进行相应的处理
18 */
19 public void run() {
20
21 try {
22 // 创建与服务器的连结
23 java.net.Socket sc = new java.net.Socket(ip, port);
24 // 获得界面显示图片的ImageView对象
25 image = (android.widget.ImageView) findViewById(R.id.image);
26 // 获得套接字的输入流并包装成基本数据输入流
27 java.io.DataInputStream din = new java.io.DataInputStream(sc
28 .getInputStream());
29
30 // 不断监听输入流的数据情况
31 while (true) {
32 // 当流中有数据时,读取数据并进行处理
33 if (din.available() > 0) {
34
35 // 创建data数组并将流中数据读取到数组中
36 byte[] data = new byte[din.readInt()];// 注此处同样没有处理图片大小超过int的范围的情况
37 din.read(data);
38
39 // 根据读到的文件数据创建Bitmap对象bitmap,因为将要在后面的内部类中使用bitmap,所以定义为
40 // final型
41 final android.graphics.Bitmap bitmap = android.graphics.BitmapFactory
42 .decodeByteArray(data, 0, data.length);
43
44 // 将图片显示到ImageView上
45 // 此处由于view中的组件都是线程不安全的,使用android提供的这个办法处理(详见下文“附2”)
46 image.post(new Runnable() {
47
48 public void run() {
49 // 将bitmap显示到界面上
50 image.setImageBitmap(bitmap);
51 }
52 });
53 }
54
55 // 线程休息1s
56 Thread.sleep(1000);
57 }
58
59 } catch (Exception e) {
60 e.printStackTrace();
61 }
62 }
63
64 }

3、main.xml


 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout android:orientation="vertical"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 xmlns:android1="http://schemas.android.com/apk/res/android"
6 xmlns:android="http://schemas.android.com/apk/res/android">
7 <ImageView android:layout_width="wrap_content"
8 android:layout_height="wrap_content"
9 android:id="@+id/image"
10 android:gravity="center" />
11 </LinearLayout>

附1 、android做通信时需要在AndroidMainFest中添加一个permission:

Java代码

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

附2 、关于android中view的组件线程不安全,已经有很多前辈对此做了详尽的分析,在此我就不再赘述,只给大家提供一个可供参考的地址:http://www.cnblogs.com/playing/archive/2011/03/24/1993583.html

附3 、发送和接收数据时,有很多种方法可选,此处使用的byte数组方法有几点需要注意:

a、new
byte[]时,传入的数组大小是int型的,所以我们必须考虑到当文件数据超出整型的范围时,需要辅以别的方法来保证数据的完整性。

b、从文件读取数据,并写入到输出流时,文中使用的代码是:

Java代码

  1. byte[] data = new byte[fin.available()];//创建用于存放文件数据数组
  2. fin.read(data);//将文件数据读取到数组中
  3. dou.write(data);// 将数组写入到输出流中

可是不乏有偷懒的码友这样写:

Java代码

  1. dou.write(fin.read(new byte[fin.available()]));
  2. //只要我们稍微查看一下JDK就会发现:read()如果因为已经到达文件末尾而没有更多的数据,则返回 <code>-1,这样一来写入到输出流中的可就不是我们的文件数据了哦!</code>

更有甚者会这样写:

Java代码

  1. dou.write(new byte[fin.available()]);//根本就没有将文件数据读入到数组中

以上几种错误都是我自己遇到过的,这类很细节的问题要检查出来都会比较费时间,希望各位码友引以为戒!

从服务器 (PC 端 ) 发送图片到客户端 (android 手机端 ) [转]

时间: 2024-10-15 15:22:18

从服务器 (PC 端 ) 发送图片到客户端 (android 手机端 ) [转]的相关文章

PC端写的API接口和手机端APP联合调试

一.遇到问题的情况:项目框架:asp.net MVC5 ,写的给手机端调用的API接口. 二.自己在本地 IIS上部署项目,在手机端的请求服务器上把地址和端口换上本地部署的,如图所示 三.用管理员的身份打开VS,打开项目.找到调试-->附加到进程 找到部署项目运行对应的进程,选择后添加添加. 然后你的程序也就 进入调试模式,从APP上调用接口,就可以进入到PC端的调试模式,看看传参对不对,PC端代码逻辑等bug调试. 原文地址:https://www.cnblogs.com/ElvisZhong

一步一步学会http获取tomcat服务端的图片,在android客户端显示

最简单的利用服务端来下载图片到客户端上面,刚开始接触,记录一下,同时希望帮助到新人. 在看本篇文章之前,你可以先看下这两篇文章 加载web项目时报的错误:Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modul http://blog.csdn.net/harryweasley/article/details/45723443 Eclipse无法启动tomcat http://blog.csdn.ne

利用ddmlib 实现 PC端与android手机端adb forword socket通信(转)

上篇文章讲了PC与android手机连接的办法 ,通过java调用系统命令执行adb命令操作,实际上是一个比较笨的办法. 网上查阅资料,发现google 提供了ddmlib库 (adt-bundle\sdk\tools 目录下), 提供了adb相关操作的所有api. 文档参考 http://www.jarvana.com/jarvana/view/com/google/android/tools/ddmlib/r13/ddmlib-r13-javadoc.jar!/index.html 参考范例

megapix-image插件 使用Canvas压缩图片上传 解决手机端图片上传功能的问题

最近在弄微信端的公众号.订阅号的相关功能,发现原本网页上用的uploadify图片上传功能到手机端有的手机类型上就不能用了,比如iphone,至于为啥我想应该不用多说了吧(uploadify使用flash实现上传的): 经过研究找到了一个手机端比较相对比较好用的插件实现图片上传,那就是megapix-image插件,比uploadify还是好用多了,下面就来上实例吧: html页面: <html> <body> <input type="file" cap

serverSpeed是一个android手机端到服务器间udp/tcp对比测速软件

https://github.com/eltld/serverSpeed https://github.com/c-wind/serverSpeed https://github.com/PeterKnego/LeanEngine-Android

主流游戏引擎分析 【端游 、页游 、手游 解析】

该分享仅供参考,目的是提升大家对游戏引擎方面的一些认知.文档中部分内容收集于互联网,若有内容不准确,还请告知. 关于本文PPT文档:github 一.介绍 游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些互交式实时图像应用程序的核心组件.这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程序而不用由零开始.大部分都支持多种操作系统平台,如Linux.Mac OS X.微软Windows.游戏引擎包含以下系统:渲染引擎(即"渲染器",含二

职业定位(Web前端、后台、PC端)

Web前端 Web前端开发工程师:http://baike.sogou.com/v18499271.htm WEB前端开发面试题集锦:http://wenku.baidu.com/view/47bbcbdc50e2524de5187eae.html 浅谈前端开发的水有多深:http://www.w3cfuns.com/blog-5446428-5400629.html 前端网:http://www.w3cfuns.com/portal.php 后台: Java / Android / Linux

Exchange 2010 手机端无法发送10M以上的附件?

这几天碰到一个这样的问题,Exchange 2010邮件系统的手机客户端无法发送10MB以上的附件.问题描述: 在Exchange 2010环境中,邮件接收器和发送器限制都设置了35M,Windows 上Outlook 可以发送大邮件,但是手机端无法发送或者转发10M以上的邮件. 原因分析: 手机端连接Exchange使用的是ActiveSync协议,这个问题发生是由于Exchange服务器上ActiveSync默认的Max Request Length设置是10MB.手机端连接Exchange

微信开发在Pc端调用公众号粉丝发送过来的图片素材

因为项目要在PC端搞一个微信墙功能,就是把粉丝发送过来的上墙内容给展示出来,但因为微信对微信素材进行了防盗链加密处理,所以在非微信页面上直接引用在微信服务器上的图片的链接是无法显示的,只会显示一张微信默认提示图片,如果我们要调用的话就只能先调用微信获取临时素材接口 https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID把图片先下载到自己服务器再进行调用,这样就很简单了