从服务器
(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()]);//根本就没有将文件数据读入到数组中
以上几种错误都是我自己遇到过的,这类很细节的问题要检查出来都会比较费时间,希望各位码友引以为戒!
分享到:
相关推荐
【Android通信传输图片显示在手机端】的知识点详解 在Android开发中,有时...以上就是Android通信传输图片并显示在手机端的主要步骤和技术要点,实现过程中需要注意性能优化和异常处理,确保应用的稳定性和用户体验。
【PC端与Android端通信】是指在个人计算机(PC)和Android设备之间建立通信链路,以便进行数据传输或控制指令的交互。这种通信通常利用USB接口,通过adb(Android Debug Bridge)工具实现。adb是Android开发环境中的...
在Android开发中,有时我们需要实现设备与PC之间的通信,例如进行数据传输或者调试。本教程将探讨如何在Android设备上通过USB接口与PC进行双向通信,支持字符和文件的交互。这种通信方式常用于设备控制、数据同步...
在Android开发中,将手机与PC通过USB...在Android端,利用USB API和Socket进行数据交换,而在PC端,通过Socket与Android设备建立连接并进行通信。理解这些概念并结合具体的代码实现,就能构建一个完整的USB通信系统。
本文将深入探讨如何通过USB接口实现手机端摄像头数据的采集与传输到PC的过程,这涉及到的主要技术包括安卓系统的API调用、摄像头操作、USB通信协议以及客户端-服务器模型的应用。 首先,我们需要了解的是手机端...
在IT领域,尤其是在移动设备和桌面系统的交互中,"PC通过USB与Android APP通信"是一个常见且重要的主题。这个过程通常涉及到多个技术层面,包括USB通信协议、Android开发者选项、APP编程接口(API)以及数据传输机制...
在IT行业中,Android App与PC通信是一个常见的需求,特别是在特定环境下如无WiFi网络或需要高度安全性的场景。本文将深入探讨如何通过USB连接实现Android应用与个人计算机(PC)之间的Socket通信。 首先,理解...
"Android+PC Socket通信"指的是通过TCP Socket协议实现Android设备(手机客户端)与个人计算机之间的数据传输。Socket通信允许应用程序之间建立端到端的连接,进行双向数据交换,非常适合用于实时通讯、文件传输等...
4. **数据解析和处理**:收到数据后,PC端需要解析数据并执行相应操作,如保存、显示或进一步处理。 这个Demo的核心是建立两端的通信通道并实现数据的可靠传输。在实际应用中,可能还需要处理错误、优化性能、确保...
在手机端,应用程序则提供了一个直观的界面,用于配置蓝牙连接,并实时监控和传输串口数据。这样的设计使得无论在远程调试、设备监控还是测试过程中,用户都能灵活选择使用电脑或移动设备进行操作。 【标签】: 1. ...
总结,实现“Android摄像上传PC并显示”涉及到Android的图像采集与编码、Socket通信,以及PC端的服务器编程、数据解码和图像显示。这个过程中,不仅要关注代码的正确性,还要注意性能优化,确保在各种网络环境下的...
2. **Android默认IP地址问题**:Android系统默认分配给手机端的IP地址是“127.0.0.1”。这意味着,如果不采取特殊措施,PC客户端无法直接通过网络访问Android设备。解决方法是在PC端执行`adb forward tcp:12580 tcp:...
在这个场景下,Android手机作为客户端(Client),而PC作为服务器端(Server),它们通过WiFi网络建立连接并交换数据。 首先,我们来详细了解一下Socket通信的基本原理: 1. **服务器端(PC)**: - 创建...
在IT行业中,实时通信(Real-Time Communication,RTC)是一个关键领域,特别是在移动设备如Android与个人计算机(PC)之间。这种通信技术允许设备之间快速、高效地交换数据,无论是文本消息、语音通话还是视频会议...
串口通信,全称为串行通信,是一种古老但依然广泛应用的数据传输方式,尤其在嵌入式系统和设备间通信中占据重要地位。Android系统作为移动设备操作系统,有时也需要与外部设备,如电脑或其他硬件模块,进行串口通信...
在Android开发中,Socket编程是实现设备间网络通信的关键技术,尤其在构建移动应用与桌面应用(如PC)交互的场景下。本实例主要讲解如何使用Android Socket进行客户端与服务器端以及不同Android设备间的通信。 首先...
标题中的“基于Socket的Android手机视频实时传输服务器端”指的是使用Socket编程技术,在Android设备上实现视频流的实时传输到服务器端(PC)的应用。Socket是网络编程的基础,它允许两个程序通过网络进行通信,这里...
在IT领域,实现“PC机摄像头摄像数据在Android手机上同步显示”的技术涉及到多个方面的知识,包括网络通信、多媒体处理、跨平台编程以及Android和Windows应用程序开发。以下是对这一主题的详细阐述: 首先,我们...
该压缩包文件主要涉及到的是一个Android应用开发的实践案例,其目标是实现手机摄像头拍摄的图片通过Wi-Fi网络传输到个人计算机(PC)并进行显示。这个案例涵盖了多个IT领域的知识点,包括Android应用开发、图像处理...
6. **视频监控PC端程序**:压缩包中包含的"视频监控PC端程序.rar"表明项目还包括了一个接收并显示这些视频流的PC端应用程序。这可能涉及到Java的Swing或JavaFX库,或者使用其他桌面开发技术如C#或Python。 7. **...