`
csu丫丫
  • 浏览: 12056 次
  • 性别: 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  

相关推荐

    Android通信传输图片显示在手机端

    【Android通信传输图片显示在手机端】的知识点详解 在Android开发中,有时...以上就是Android通信传输图片并显示在手机端的主要步骤和技术要点,实现过程中需要注意性能优化和异常处理,确保应用的稳定性和用户体验。

    PC端与android端通信

    【PC端与Android端通信】是指在个人计算机(PC)和Android设备之间建立通信链路,以便进行数据传输或控制指令的交互。这种通信通常利用USB接口,通过adb(Android Debug Bridge)工具实现。adb是Android开发环境中的...

    Android通过USB与PC端双向通信【支持字符、文件】

    在Android开发中,有时我们需要实现设备与PC之间的通信,例如进行数据传输或者调试。本教程将探讨如何在Android设备上通过USB接口与PC进行双向通信,支持字符和文件的交互。这种通信方式常用于设备控制、数据同步...

    android手机通过usb线与PC连接通信代码

    在Android开发中,将手机与PC通过USB...在Android端,利用USB API和Socket进行数据交换,而在PC端,通过Socket与Android设备建立连接并进行通信。理解这些概念并结合具体的代码实现,就能构建一个完整的USB通信系统。

    手机端摄像头采集数据,通过USB传输到PC

    本文将深入探讨如何通过USB接口实现手机端摄像头数据的采集与传输到PC的过程,这涉及到的主要技术包括安卓系统的API调用、摄像头操作、USB通信协议以及客户端-服务器模型的应用。 首先,我们需要了解的是手机端...

    PC 通过USB 与android APP 通信

    在IT领域,尤其是在移动设备和桌面系统的交互中,"PC通过USB与Android APP通信"是一个常见且重要的主题。这个过程通常涉及到多个技术层面,包括USB通信协议、Android开发者选项、APP编程接口(API)以及数据传输机制...

    android app与pc通信,USB连接socket通信,

    在IT行业中,Android App与PC通信是一个常见的需求,特别是在特定环境下如无WiFi网络或需要高度安全性的场景。本文将深入探讨如何通过USB连接实现Android应用与个人计算机(PC)之间的Socket通信。 首先,理解...

    android+pc socket通信

    "Android+PC Socket通信"指的是通过TCP Socket协议实现Android设备(手机客户端)与个人计算机之间的数据传输。Socket通信允许应用程序之间建立端到端的连接,进行双向数据交换,非常适合用于实时通讯、文件传输等...

    通过USB进行PC端和Android的数据交互

    4. **数据解析和处理**:收到数据后,PC端需要解析数据并执行相应操作,如保存、显示或进一步处理。 这个Demo的核心是建立两端的通信通道并实现数据的可靠传输。在实际应用中,可能还需要处理错误、优化性能、确保...

    qt for Android蓝牙串口助手app PC端手机端均可使用

    在手机端,应用程序则提供了一个直观的界面,用于配置蓝牙连接,并实时监控和传输串口数据。这样的设计使得无论在远程调试、设备监控还是测试过程中,用户都能灵活选择使用电脑或移动设备进行操作。 【标签】: 1. ...

    android摄像上传PC并显示

    总结,实现“Android摄像上传PC并显示”涉及到Android的图像采集与编码、Socket通信,以及PC端的服务器编程、数据解码和图像显示。这个过程中,不仅要关注代码的正确性,还要注意性能优化,确保在各种网络环境下的...

    PC客户端与Android服务端的Socket同步通信.docx

    2. **Android默认IP地址问题**:Android系统默认分配给手机端的IP地址是“127.0.0.1”。这意味着,如果不采取特殊措施,PC客户端无法直接通过网络访问Android设备。解决方法是在PC端执行`adb forward tcp:12580 tcp:...

    android在wifi下手机与PC的socket通信

    在这个场景下,Android手机作为客户端(Client),而PC作为服务器端(Server),它们通过WiFi网络建立连接并交换数据。 首先,我们来详细了解一下Socket通信的基本原理: 1. **服务器端(PC)**: - 创建...

    android与Pc实时通信

    在IT行业中,实时通信(Real-Time Communication,RTC)是一个关键领域,特别是在移动设备如Android与个人计算机(PC)之间。这种通信技术允许设备之间快速、高效地交换数据,无论是文本消息、语音通话还是视频会议...

    串口通信,Android端与电脑端串口通信Demo

    串口通信,全称为串行通信,是一种古老但依然广泛应用的数据传输方式,尤其在嵌入式系统和设备间通信中占据重要地位。Android系统作为移动设备操作系统,有时也需要与外部设备,如电脑或其他硬件模块,进行串口通信...

    Android Socket编程实例(与PC通信,不同手机中间通信)

    在Android开发中,Socket编程是实现设备间网络通信的关键技术,尤其在构建移动应用与桌面应用(如PC)交互的场景下。本实例主要讲解如何使用Android Socket进行客户端与服务器端以及不同Android设备间的通信。 首先...

    基于Socket的Android手机视频实时传输服务器端

    标题中的“基于Socket的Android手机视频实时传输服务器端”指的是使用Socket编程技术,在Android设备上实现视频流的实时传输到服务器端(PC)的应用。Socket是网络编程的基础,它允许两个程序通过网络进行通信,这里...

    PC机摄像头摄像数据在Android手机上同步显示

    在IT领域,实现“PC机摄像头摄像数据在Android手机上同步显示”的技术涉及到多个方面的知识,包括网络通信、多媒体处理、跨平台编程以及Android和Windows应用程序开发。以下是对这一主题的详细阐述: 首先,我们...

    Android应用源码之将手机摄像头获取的图片通过wifi发送到PC机上并进行显示.rar

    该压缩包文件主要涉及到的是一个Android应用开发的实践案例,其目标是实现手机摄像头拍摄的图片通过Wi-Fi网络传输到个人计算机(PC)并进行显示。这个案例涵盖了多个IT领域的知识点,包括Android应用开发、图像处理...

    sp_java_handsomemmf_socket_android监控_android_

    6. **视频监控PC端程序**:压缩包中包含的"视频监控PC端程序.rar"表明项目还包括了一个接收并显示这些视频流的PC端应用程序。这可能涉及到Java的Swing或JavaFX库,或者使用其他桌面开发技术如C#或Python。 7. **...

Global site tag (gtag.js) - Google Analytics