`
csu丫丫
  • 浏览: 11603 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

PC_android通信之传输图片并显示在手机端

阅读更多

从服务器 (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()]);//根本就没有将文件数据读入到数组中

 

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

 

 

 

6
0
分享到:
评论
4 楼 csu丫丫 2012-11-02  
scutzhounan 写道
您好 这段代码我运行会发现图片显示不完整,是不是字节数组内容丢失?


非常抱歉,长时间未登博客
如果图片大小超出int的范围,应该是数据丢失
不过按常理来说,应该不会是那么大的图片吧
也许和编码格式有关系
3 楼 scutzhounan 2012-07-10  
您好 这段代码我运行会发现图片显示不完整,是不是字节数组内容丢失?
2 楼 flycatdeng 2012-02-14  
1 楼 云初静 2012-02-11  

相关推荐

Global site tag (gtag.js) - Google Analytics