从服务器
(PC
端
)
发送图片到客户端
(android
手机端
)
,并在手机页面上显示该图片。(注:本文旨在实现功能,并未考虑效率,有待后续跟进。)
1、服务器端
int port=9090;
/**
* 发送文件的方法
* 此处定义服务器端口为9090,ip地址为192.168.1.1
* 设定被传输图片的路径为"images/icon.png"
* images文件夹放在此工程的根目录下,我们就可以通过相对路径访问这个图片文件了
*/
private void sendPic() {
try {
// 创建服务器
java.net.ServerSocket ss = new java.net.ServerSocket(port);
// 等待客户机接入,此处会阻塞,直到有客户机接入服务器
java.net.Socket client = ss.accept();
//创建将要被发送的图片的文件输入流
java.io.FileInputStream fin = new java.io.FileInputStream("images/icon.png");
//获得套接字的输出流,并包装成数据输出流
java.io.DataOutputStream dou = new java.io.DataOutputStream(client
.getOutputStream());
// 向输出流中写入文件数据长度
dou.writeInt(fin.available());//注:此处未考虑图片太大超出int范围,以至于出现内存溢出的情况
// 将实际的图片数据读取到byte[] data中
byte[] data = new byte[fin.available()];
fin.read(data);
// 将图片数据写入到输出流中
dou.write(data);
dou.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
2
、
客户端(android手机)
public class FrontPage extends android.app.Activity implements Runnable {
public void onCreate(android.os.Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.frontpage);
// 启动读取套接字中数据并进行处理的线程
new Thread(this).start();// 本类继承了Runnable接口,所以创建线程时将本类的对象传入即可
}
String ip = "192.168.1.1";
int port = 9090;
android.widget.ImageView image;// 用于显示接收到的图片的ImageView对象
/**
* 由于输入流的read方法会阻塞,为了避免它影响主界面的其他数据处理, 启动一个线程来读取输入流中的数据,并对数据进行相应的处理
*/
public void run() {
try {
// 创建与服务器的连结
java.net.Socket sc = new java.net.Socket(ip, port);
// 获得界面显示图片的ImageView对象
image = (android.widget.ImageView) findViewById(R.id.image);
// 获得套接字的输入流并包装成基本数据输入流
java.io.DataInputStream din = new java.io.DataInputStream(sc
.getInputStream());
// 不断监听输入流的数据情况
while (true) {
// 当流中有数据时,读取数据并进行处理
if (din.available() > 0) {
// 创建data数组并将流中数据读取到数组中
byte[] data = new byte[din.readInt()];// 注此处同样没有处理图片大小超过int的范围的情况
din.read(data);
// 根据读到的文件数据创建Bitmap对象bitmap,因为将要在后面的内部类中使用bitmap,所以定义为
// final型
final android.graphics.Bitmap bitmap = android.graphics.BitmapFactory
.decodeByteArray(data, 0, data.length);
// 将图片显示到ImageView上
// 此处由于view中的组件都是线程不安全的,使用android提供的这个办法处理(详见下文“附2”)
image.post(new Runnable() {
public void run() {
// 将bitmap显示到界面上
image.setImageBitmap(bitmap);
}
});
}
// 线程休息1s
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android1="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/image"
android:gravity="center" />
</LinearLayout>
附1
、android做通信时需要在AndroidMainFest中添加一个permission:
<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、从文件读取数据,并写入到输出流时,文中使用的代码是:
byte[] data = new byte[fin.available()];//创建用于存放文件数据数组
fin.read(data);//将文件数据读取到数组中
dou.write(data);// 将数组写入到输出流中
可是不乏有偷懒的码友这样写:
dou.write(fin.read(new byte[fin.available()]));
//只要我们稍微查看一下JDK就会发现:read()如果因为已经到达文件末尾而没有更多的数据,则返回 -1,这样一来写入到输出流中的可就不是我们的文件数据了哦!
更有甚者会这样写:
dou.write(new byte[fin.available()]);//根本就没有将文件数据读入到数组中
以上几种错误都是我自己遇到过的,这类很细节的问题要检查出来都会比较费时间,希望各位码友引以为戒!
分享到:
相关推荐
简单的蓝牙通讯代码,通过Java在PC端搭建服务端,实现与Android设备间通信。支持多个蓝牙手机同时连接PC进行数据传输
基于Socket的Android手机视频实时传输服务器端(PC)。
android与PC端实时通信,很实用的
在同一局域网络下 ,通过手机连接PC端 ,进行时时视频流的传输,PC端时时播放。
基于Bluez实现了蓝牙串口通信,用来与手机端,pc端传输数据。蓝牙模块服务多种多样,这个小demo实现了linux下建立蓝牙服务端的demo,并带了一个客户端测试。 使用时,可通过两台设备,分别作为服务端可客户端,连接...
系统一共2个身份: 管理员可以同时在web端和手机端对数据进行添删改查管理操作! 部门人员只能登陆手机端app后查询本部门的积分信息! 实体ER属性: 积分条件: 积分id,积分条件,分数,积分类型,mtypeid,备注 单位...
毕业设计,基于Java+MVC开发的车辆运输信息管理APP,包括PC端和安卓Anroid手机APP,内含Java源码,安卓客户端 安卓Android车辆运输信息管理App可升级Studio毕业源码案例设计 开发环境: Myclipse/Eclipse/Idea都...
毕业设计,安卓App,基于Java+MVC开发的社团管理App,包括PC端和安卓Anroid手机APP,内含Java完整源码 安卓Android社团管理App设计可升级导入Studio毕业源码案例设计 开发环境: MyEclipse/Eclipse/Idea(服务器端) ...
服务器和客户端数据通信格式: XML格式(用于传输查询的记录集)和json格式(用于传输单个的对象信息) 影院系统在电影院有着重要的地位,它不仅保存着电影院的基本信息,而且会储存大量的用户个人信息。影院系统是电影...
毕业设计,基于Java+MVC开发的二次元社区论坛bbs绘画App,包括PC端和安卓Anroid手机APP,内含Java完整源码 安卓Android二次元社区论坛bbs绘画app可导入Studio毕业源码案例设计 开发环境: Myclipse/Eclipse/Idea都...
毕业设计,基于Java+MVC开发的天气预报穿衣搭配APP,包括PC端和安卓Anroid手机APP,内含Java完整源码 安卓Android天气预报穿衣搭配APP可升级Studio毕业源码案例设计 开发环境: Myclipse/Eclipse/Idea都可以(服务器...
毕业设计,基于Java+MVC开发的初中生体育私教平台App,包括PC端和安卓Anroid手机APP,内含毕业论文和源代码 安卓Android初中生体育私教平台app可导入Studio毕业源码案例设计 开发环境: Myclipse/Eclipse/Idea都...
毕业设计,基于Java开发的校园办公用品管理系统,包括PC端和安卓Anroid手机APP,内含Java完整源代码,数据库脚本 安卓Android校园办公用品管理系统可导入Studio毕业源码案例设计 开发环境: Myclipse/Eclipse/Idea...
毕业设计,基于Java+MySql开发的洗衣店预约系统,包括PC端和安卓Anroid手机APP,含Java完整源代码,数据库脚本 安卓Android洗衣店预约系统的设计与实现可导入Studio毕业源码案例设计 开发环境: Myclipse/Eclipse/...
毕业设计,安卓APP,基于Java+MVC开发的求职招聘系统App,包括PC端和安卓Anroid手机APP,内含Java完整源码 安卓Android求职招聘系统App毕业源码案例设计 开发环境: MyEclipse/Eclipse/Idea(服务器端) + Eclipse...
毕业设计,基于Java+MVC开发的快递代拿跑腿APP,包括PC端和安卓Anroid手机APP,内含Java完整源码,安卓客户端 安卓Android快递代拿跑腿APP设计可升级Studio毕业源码案例设计 开发环境: Myclipse/Eclipse/Idea都...
毕业设计,基于Java+MVC开发的图书馆座位占座App,包括PC端和安卓Anroid手机APP,含Java完整源码,安卓客户端 安卓Android图书馆座位占座app设计可导入Studio毕业源码案例设计 开发环境: Myclipse/Eclipse/Idea都...
毕业设计,基于Java+MySql开发的商城购物系统,包括PC端和安卓Anroid手机APP,内含Java完整源代码,数据库脚本 安卓Android平台的滴滴购物系统设计可导入Studio毕业源码案例设计 开发环境: Myclipse/Eclipse/Idea...
市场上相应的检测平台诸如检测通、凡特网等皆为pc端检测网站,并且操作繁琐不够人性化,用户在实地使用中存在很多问题。昆山工业技术研究院着眼于为委托用户和质检机构搭建良好的沟通桥梁,免去目前市场业务中企业...
开发环境: MyEclipse/Eclipse/Idea都行(服务器端) + Eclipse/AndroidStudio都行(手机客户端) + mysql数据库 系统客户端和服务器端架构技术: 界面层,业务逻辑层,数据层3层分离技术,MVC设计思想! 服务器和客户端...