- 浏览: 358843 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
格子衫星人:
不行 红米手机 版本21 测试失败
从assets目录复制文件夹和文件,(不只是文件,附demo) -
zclzcllll:
能不能再给个退个按钮和π的按钮的
基于VC的MFC计算器案例步骤及源代码 -
shezhangjiadao:
写的非常好!!不过我有几个小建议~希望楼主能更正一下~~[co ...
基于VC的MFC计算器案例步骤及源代码 -
flycatdeng:
夜色蓝 写道我想说dx在sdk的build-tools里面比如 ...
dx工具(android将jar包转成dex格式二进制jar包工具) -
夜色蓝:
我想说dx在sdk的build-tools里面比如build- ...
dx工具(android将jar包转成dex格式二进制jar包工具)
一、思路:通过PC服务器向Android手机客户机发送图片
1、创建java工程PC服务器
1)、创建服务器对象,带有指定端口
2)、让服务器循环等待客户机的连接
3)、点击按钮出现文件选择器,得到文件路径
4)、取得连结对象上的流对象,再将流传送给客户机
5)、创建一个界面,点击按钮,选择图片,取得图片的信息,发送给客户机
2、Android工程手机客户端
1)、创建好工程
2)、在第一个页面显示之后,创建客户对象(记得加互联网权限android.permission.INTERNET)
得到输入输出流
3)、编辑想要的页面(在第二个页面操作),编辑第一个页面的内容(main.xml)
除第一个Activity外,其他Activity需要在AndroidManifest中注册;
4)、取得各组件的ID并转型为所要的组件类型,跳转页面的条件
5)、点击“接收”按钮,得到服务器传来的流,并转换成bitmap再显示在页面上
二、一些细节:
1、文件选择器JFileChooser不是你想用就能用的,需要借助JFrame才能显示
2、文件选择,显示提示框,选择文件,并得到其路径的方法:
JFileChooser jfc = new JFileChooser();// 创建一个文件选择器 jfc.showOpenDialog(null);// 提示对话框 File file = jfc.getSelectedFile();// 得到所选中的文件 srcFile = file.getAbsolutePath();// 文件的绝对路劲
3、可能出于使用无线网或其他什么原因,ip可能一下子又变了,所以,创建客户对象的时候一定要小心其IP:
client = new Socket("192.168.1.24", 8090);//创建客户对象(每次都要取得服务器的ip)
4、将所得到的流转换为bitmap,并将其显示到页面上:
final Bitmap bitmap = new BitmapFactory().decodeByteArray(data, 0, in);// 转换成bitmap格式的方法,这里由于在下面这个run方法里需要用到bitmap,所以要定义成final类型的 icon_1.post(new Runnable() { public void run() { // 将bitmap显示到界面上 icon_1.setImageBitmap(bitmap); } });
5、其他:流的顺序;添加权限;Activity注册,通过找到相应的ID转换成相应的组件也是需要注意的
三、其他拓展:
EditText中 android:password="true",设置编辑框为密码输入框
ImageView为图片组件
四、代码及注释:
1、PC服务器端:
package androidke.flycatdeng.PCServer; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; /** * 图片发送电脑服务器至android手机端 * @author flycatdeng */ public class PhotoSentServer extends JFrame { // 声明 Socket client;// 客户对象 String srcFile;// 图片地址 InputStream ins;// 输入流对象 OutputStream ous;// 输出流对象 DataOutputStream dos;// 封装成数据输出流对象 DataInputStream dis;// 封装成数据输入流对象 // 主函数 public static void main(String[] args) { try { PhotoSentServer pss = new PhotoSentServer(); pss.frameShow();// 显示窗体 pss.setupServer(8090);// 启动服务器 } catch (Exception e) { e.printStackTrace(); } } // 显示窗体的方法 public void frameShow() { this.setTitle("服务器端");// 标题 this.setSize(200, 200);// 窗体大小 this.setLayout(new FlowLayout(0, 0, 0));// 流式布局 JButton jbt = new JButton("发送图片");// 创建一个按钮 jbt.setActionCommand("sendPhoto");// 按钮监听发送消息 jbt.addActionListener(al);// 按钮添加事件监听器 this.add(jbt);// 按钮显示在窗体上 this.setDefaultCloseOperation(3);// 关闭窗体后退出程序 this.setVisible(true);// 设置窗体可见 } // 内部类 ActionListener al = new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("sendPhoto")) { choosephoto();// 点击按钮后选择照片 try { processPhoto(srcFile);// 发送图片 } catch (Exception e1) { e1.printStackTrace(); } } } }; // 选择照片的方法 public void choosephoto() { JFileChooser jfc = new JFileChooser();// 创建一个文件选择器 jfc.showOpenDialog(null);// 提示对话框 File file = jfc.getSelectedFile();// 得到所选中的文件 srcFile = file.getAbsolutePath();// 文件的绝对路劲 System.out.println("选择的图片成功,地址是:" + srcFile); } // 发送图片的方法 public void processPhoto(String srcFile) throws Exception { InputStream ins = new FileInputStream(srcFile);// 得到选中文件的流 DataInputStream dis = new DataInputStream(ins);// 包装 int fileLen = dis.available();// 得到文件的大小 System.out.println("图片的大小为" + fileLen); if (fileLen > 0) {// 如果有流则执行下面的 System.out.println("准备读流中"); dos.writeInt(fileLen);// 将文件的大小以int输出 byte[] data = new byte[fileLen]; dis.read(data);// 以字节数组读取 dos.write(data);// 输出 dos.flush();// 强制完全输出 System.out.println("读完流了"); } } // 创建服务器的方法 public void setupServer(int port) throws Exception { ServerSocket server = new ServerSocket(port);// 创建服务器对象,带有指定的端口 System.out.println("创建服务器成功,端口:" + port); // 让服务器循环等待客户的连接 while (true) { client = server.accept();// 等待客户连接 System.out.println("有客户连接进来啦,IP地址:" + client.getRemoteSocketAddress());// 取得打印客户机的IP地址 ous = client.getOutputStream();// 得到客户输出流 ins = client.getInputStream(); dos = new DataOutputStream(ous); dis = new DataInputStream(ins); } } }
2、Android客户端:
1)、第一个Activity:
package androidke.fycatdeng.lesson004; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class FirstActivit extends Activity { // 声明 Button button_send; EditText edit_username, edit_password; Socket client; // 定义静态的输入输出流,以便其他页面使用 static InputStream ins; static OutputStream ous; // 重写(这个相当于主函数) public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 显示第一个页面后,创建客户对象 try { client = new Socket("192.168.1.24", 8090);//创建客户对象(每次都要取得服务器的ip) System.out.println("客户创建成功!!!"); ins = client.getInputStream();// 得到客户输入输出流 ous = client.getOutputStream(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(FirstActivit.this, "未连接到服务器,请重新其启动!", 3).show(); } // 可视后取得各个组件的id并强制转换为相应的组件类型 button_send = (Button) this.findViewById(R.id.button_send);// 提交按钮 edit_username = (EditText) this.findViewById(R.id.edit_username);// 用户名编辑框 edit_password = (EditText) this.findViewById(R.id.edit_password);// 密码编辑框 button_send.setOnClickListener(ocl);// 给按钮添加(设置)监听器 } // 内部匿名类 OnClickListener ocl = new OnClickListener() {// 这个包引进的时候需要注意,选择的是第二个:android.view.View.OnClickListener; // 重写方法 public void onClick(View v) { // 将编辑框的内容得到并转换为字符串 String username = edit_username.getText().toString(); String password = edit_password.getText().toString(); if ("dck".equals(username) && "1".equals(password)) { // 用户名个密码都正确后则跳转页面 Intent intent = new Intent(FirstActivit.this, SecondActivity.class); // 跳转页面的时候,把那个客户对象也传过去 // intent.putExtra("clientFlag",client); FirstActivit.this.startActivity(intent); } else { // 如果登录错误则提示 Toast.makeText(FirstActivit.this, "用户名不存在活密码错误!", 3).show();// 副本,内容,停留时间以秒为单位 } } }; }
2)、第二个Activity:
package androidke.fycatdeng.lesson004; import java.io.DataInputStream; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; public class SecondActivity extends Activity { Button button_recivePhoto; ImageView icon_1; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second);// 转到第二个页面second.xml、 // 取得第二页面的按钮id转型为所需组件类型 button_recivePhoto = (Button) this .findViewById(R.id.button_recivePhoto); button_recivePhoto.setOnClickListener(ocl);// 接收按钮绑定监听器 icon_1 = (ImageView) this.findViewById(R.id.icon_1); } // 内部匿名类 OnClickListener ocl = new OnClickListener() {// // 这个包引进的时候需要注意,选择的是第二个:android.view.View.OnClickListener; // 重写方法 public void onClick(View v) { try { System.out.println("点击按钮准备接收图片!"); recivePhoto();// 点击按钮后接收图片 } catch (Exception e) { e.printStackTrace(); } } }; // 接收图片的方法 public void recivePhoto() throws Exception { DataInputStream dis = new DataInputStream(FirstActivit.ins); int in = dis.readInt(); byte[] data = new byte[in]; dis.read(data); System.out.println("读完流了!准备转换图片"); final Bitmap bitmap = new BitmapFactory().decodeByteArray(data, 0, in);// 转换成bitmap格式的方法,这里由于在下面这个run方法里需要用到bitmap,所以要定义成final类型的 icon_1.post(new Runnable() { public void run() { // 将bitmap显示到界面上 icon_1.setImageBitmap(bitmap); } }); System.out.println("转换完了!"); } }
3)、第一个页面:main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <!-- 这下面的前两句是每个组件必要的属性 --> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="欢迎使用手机CC" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="用户名:" /> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/edit_username" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="密码:" /> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:password="true" android:id="@+id/edit_password" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="提交" android:id="@+id/button_send" /> </LinearLayout>
4)、第二个页面:second.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <!-- 这下面的前两句是每个组件必要的属性 --> <!-- dip表示像素 --> <Button android:layout_width="100dip" android:layout_height="wrap_content" android:text="接收" android:id="@+id/button_recivePhoto" /> <!-- ImageView为图片组件 --> <ImageView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/icon_1" /> </LinearLayout>
五、效果:
发表评论
-
TextureView展示OpenGL内容(Demo)
2017-02-27 14:43 7356上图的实 ... -
自定义RatingBar的显示(评分组件)
2016-01-27 18:15 3528做项目中有要用到评分控件,本以为可以直接使用 ... -
ListView设置分割线的长度
2016-01-25 20:53 7489android中ListView默认的分割线是填充满整个l ... -
几种获取应用程序/apk安装包版本信息的方法
2015-12-19 15:17 12944获取到PackageInfo之后,那么包名,版本号什么的都可 ... -
获取IMEI号耗时10秒导致黑屏的解决
2015-12-16 23:24 1649描述:一个应用,首 ... -
android由应用包名得到该应用的默认启动类
2015-09-08 21:06 5614/** * get the launch ... -
android获取编译之后的点9图片
2015-09-07 17:22 4477今天要给桌 ... -
android小注意
2015-08-24 19:58 13243.一个Activity不能有多个GLSurfaceVie ... -
点击打开进入应用的动画(点击非Android View)
2015-05-16 17:06 4528android点击一个View进入一个应用,通常会有好几种动 ... -
SharedPreferences跨应用跨进程获取数据(附件)
2014-12-13 16:17 12420在做一个应用的时候,该应用本来是和桌面放在一起的,后来不得 ... -
从assets目录复制文件夹和文件,(不只是文件,附demo)
2014-11-15 18:24 9609最近要将时钟的一些资源做成文件夹放到apk中,然后用户安装的 ... -
复制文件/文件夹,删除文件/文件夹
2014-10-20 12:33 947复制文件夹: public static boolean ... -
dx工具(android将jar包转成dex格式二进制jar包工具)
2014-10-08 10:21 53939好吧,不得不承认这个工具真心难找,也不知道自己sdk里以前 ... -
android获取系统铃声并播放
2014-09-24 15:33 30458private void startAlarm() thr ... -
亮屏解锁
2014-09-24 15:28 751/** * 解锁屏 * @para ... -
在自己应用中判断刚刚去往动态壁纸预览页面的壁纸是否设置成功
2014-08-15 19:03 3824本来从动态壁纸预览页 ... -
去往某个动态壁纸的预览页面,那里可以设置壁纸(4.12及其以上版本)
2014-08-12 17:15 3845/** * 去往某个动态壁纸的预览页面, ... -
android动态加载class文件(DexClassLoader可从SD卡加载)(android插件开发)
2014-08-05 21:22 3499一、思路 1、这段时间因为要做一个自定义 ... -
LibGDX制作android动态壁纸
2014-06-27 11:38 2753一、还是像普通的android动态壁纸一样,创建一个没有a ... -
android动态壁纸1——初步框架(有背景,能使用,仿可爱宝贝)
2013-10-30 18:52 4220可爱宝贝下载链接 一、简介: 正如别人 ...
相关推荐
这个"Android简易版聊天室"项目旨在提供一个基础架构,用于理解多平台间实时通信的工作原理。 首先,我们要理解Android手机客户端部分。在Android应用开发中,我们通常使用Java或Kotlin作为主要编程语言,结合...
在这个项目中,开发者利用Android的网络编程能力和TCP/IP协议来构建一个简易版的即时通讯工具,类似于QQ的功能,使两端能够实时发送和接收消息。 首先,我们要理解Android端作为服务器的角色。在Android平台上,...
支持Android、Ios、PC、WEBGL; 项目中的Script/Core目录就是完整框架。 【游戏流程管理】: 1.游戏逻辑入口从某一个游戏流程开始(创建一个流程继承IGameStatus,然后在ApplicationManager中选择它作为第一个流程) ...
在Android平台上,开发一款基于传感器的应用程序涉及到多个关键知识点,这些知识点构成了Android系统与硬件交互的基础。本项目"基于Android的传感器app应用.zip"显然旨在教授如何利用Android Studio来创建一个能够...
实验环境为 PC、Android SDK 和 Eclipse,实验内容为自选题目完成一个 Android 应用程序。实验结果包括 DBService.java 代码,用于创建数据库和实现数据的 CRUD 操作。 DBService.java 代码中,使用了 ...
这样的安装配置让Python开发不仅限于传统的PC环境,也为移动设备上的编程学习和实践提供了可能。教程中还提到了,虽然使用了较旧版本的SL4A和Python for Android,但为的是让低配置的设备也能顺畅运行,鼓励用户在...
该源码为计网课程socket编程实现简易微信的代码实践,内含本机服务器代码(eclipse打开)+PC端简易客户端(eclipse)+android客户端(androidStudio打开)。实现了简单的用户登录、添加好友、socket通信、表情发送等...
本项目聚焦于“VideoServer_android_视频_视频服务器”,它利用NanoHttpd库实现在Android设备上搭建一个简易的视频服务器,使得个人电脑(PC)可以远程访问并播放手机上的视频资源。下面将详细介绍这个项目及其相关...
本书通过实例和源代码,提供了一个独特的视角,展示了将原生PC游戏移植到Android平台的简易方法。 书中第一章介绍了小绿机器人(Android平台)的世界,向读者提供了对于Android游戏开发的初步了解和基础。紧接着第...
在这个聊天室中,用户可以通过发送消息与房间内的其他用户实时交流。 【描述】: "基于socket的简易多人聊天室基于socket的简易多人聊天室基于socket的简易多人聊天室" 基于Socket的多人聊天室设计主要涉及以下关键...
:red_heart:为什么在PC和Mac / Windows上使用“最佳账单提醒”? :red_heart:1. Mobills预算计划程序并跟踪您的财务状况2. Easybills –帐单提醒3. Spendee-预算和费用跟踪程序与计划程序4.带有同步功能的家庭预算...
- **用户界面**:Android Studio提供了丰富的布局和组件,如RecyclerView用于展示新闻列表,ImageView用于加载图片,TextView用于显示文字内容,以创建友好的用户体验。 4. **服务器端实现**: - **RESTful API...
【安卓简易聊天室】是一个基于Java编程语言开发的计算机网络课程设计项目,旨在实现一个基本的聊天应用程序,供用户在Android设备上进行实时通信。在这个项目中,开发者使用了Socket编程技术来实现实时的数据传输,...
《基于Android的辅助办公APP的设计与实现》这篇文章探讨了如何在Android平台上开发一款针对油气资源行业的移动辅助办公应用。文章指出,随着移动设备的普及,移动办公应用因其便捷性和随时随地的在线特性,已经成为...
【AndroidPCControl:小型简易PC遥控器安卓版原始码】是一个开源项目,旨在提供一个解决方案,让用户通过Android设备远程控制个人计算机(PC)。这个项目的核心是实现手机与电脑之间的交互,使得用户可以在移动设备上...
本系统是一个基于单片机的简易触摸屏手机。最近几年,手机的发展日新月异, 特别是 android 操作系统和触摸屏的便捷性,使触摸屏手机迅速普及,触摸屏手机 将是未来手机的主流配置,此系统就是研究触摸屏手机的工作...
用Google Application Engine的简易家庭记账软件,用Android或PC日常记账,软件提供简单的收支分类统计和按月的收支统计。
Antiyoy是一个简单的基于回合的android策略。 易于学习,难以掌握。 最新的APK文件和PC版本可在以下位置找到: : 特征: 多人最多可容纳10人的Hotseat多人游戏 随机图生成器 流畅的动画和良好的优化 简易教程 这...
简易电影纹理 包含源代码(、iOS) 源路径:EasyMovieTexture/Source 文件夹 iOS(带有 tvOS)源路径:Plugins/iOS 文件夹 [color=var(--color-font-cyan)]此演示 支持的平台:Android、iOS、AppleTV(tvOS) ...