关于socket传输图片
由于公司要做一个手机间传输图片的功能,网上的资料又太过杂乱,没有达到我想要的效果,于是自己前前后后折腾了好久,终于把这个功能做出来,现在分享出来。话不多说,上代码。
服务端代码
/* 服务器端接收数据 服务器应该要多线程,一个服务器可能会有多个客户端进行连接; */ public void receiveData() {Thread thread = new Thread() {@Override public void run() {super.run(); /*指明服务器端的端口号*/ try {serverSocket = new ServerSocket(8000); } catch (IOException e) {e.printStackTrace(); }//获取IP地址 GetIpAddress.getLocalIpAddress(serverSocket); Message message_2 = handler.obtainMessage(); message_2.what = 2; message_2.obj = GetIpAddress.getIP() + " " + GetIpAddress.getPort(); handler.sendMessage(message_2); while (true) {try {mSocket = serverSocket.accept(); socketStatus = true; } catch (IOException e) {e.printStackTrace(); }//开启接收数据的线程 new ServerThread(mSocket).start(); }}}; thread.start(); }
接收线程数据的代码
class ServerThread extends Thread {private Socket socket; private InputStream inputStream; public ServerThread(Socket socket) {this.socket = socket; }@Override public void run() {while (true) {if (socketStatus) {try {inputStream = socket.getInputStream(); } catch (IOException e) {e.printStackTrace(); }int len; byte[] bytes = new byte[1024]; boolean isString = false; try {//这里必须是无限循环的,因为服务端要随时等待客户端发送数据 //当客户端断开后其结果等于-1,循环结束 while ((len = inputStream.read(bytes)) != -1) {for (int i = 0; i < len; i++) {if (bytes[i] != '\0') {stringBuffer.append((char) bytes[i]); } else {isString = true; break; }}if (isString) {Message message_1 = handler.obtainMessage(); message_1.what = 1; message_1.obj = stringBuffer; handler.sendMessage(message_1); isString = false; stringBuffer = new StringBuffer(); }}//当这个异常发生时,说明客户端那边的连接已经断开 } catch (IOException e) {e.printStackTrace(); try {inputStream.close(); socket.close(); } catch (IOException e1) {e1.printStackTrace(); }}}}} }
接下来是客户端代码
首先是连接的代码
public void connect(View view) {ip = editText_1.getText().toString(); if (ip == null) {Toast.makeText(MainActivity.this, "please input Server IP", Toast.LENGTH_SHORT).show(); }Thread thread = new Thread() {@Override public void run() {super.run(); if (!socketStatus) {try {String msg = null; socket = new Socket(ip, 8000); if (socket == null) {msg = "连接失败"; } else {socketStatus = true; msg = "连接成功"; outputStream = socket.getOutputStream(); //receive(); }Message message_3 = handler.obtainMessage(); message_3.what = 3; message_3.obj = msg; handler.sendMessage(message_3); } catch (IOException e) {e.printStackTrace(); Log.e("MainActivity", "run: --->>" + e); }}}}; thread.start(); }
然后是发送图片的方法,这里我用R文件下的图片代替
public void send(View view){Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.wugeng);data = convertIconToString(bitmap);if (data == null) {Toast.makeText(MainActivity.this, "please input Sending Data", Toast.LENGTH_SHORT).show();} else {//在后面加上 '\0' ,是为了在服务端方便我们去解析;data = data + '\0';}Thread thread = new Thread() {@Overridepublic void run() {super.run();if (socketStatus) {try {outputStream.write(data.getBytes());} catch (IOException e) {e.printStackTrace();Log.e("MainActivity", "run: --->>" + e);}}}};thread.start();}
最后,最重要的一步!!!
请加上权限
<uses-permission android:name="android.permission.INTERNET" /> <!-- 网络权限 -->
大功告成,图片传输要经过base64加密解密传输的,代码里的message是通过handler发送消息到主线程去更新UI,相信大家应该都知道吧。记住,socket一般都是放在子线程去操作的。
附上保存图片到本地和从本地获取图片的代码
首先是保存到本地
public void saveBitmapForSdCard(String bitName, Bitmap mBitmap) {//创建file对象 File f = new File("/sdcard/" + bitName + ".png"); try {//创建 f.createNewFile(); } catch (IOException e) {}FileOutputStream fOut = null; try {fOut = new FileOutputStream(f); } catch (FileNotFoundException e) {e.printStackTrace(); }//原封不动的保存在内存卡上 mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut); try {fOut.flush(); } catch (IOException e) {e.printStackTrace(); }try {fOut.close(); } catch (IOException e) {e.printStackTrace(); } }
然后是从固定路径获取图片的方法,这里就写固定值了
private Bitmap getDiskBitmap(String pathString) {Bitmap bitmap = null; try {File file = new File(pathString); if(file.exists()){bitmap = BitmapFactory.decodeFile(pathString); }} catch (Exception e){// TODO: handle exception }return bitmap; }
附上Demo下载地址
http://download.csdn.net/download/gxianglong/10150703
关于socket传输图片相关推荐
- python socket传输图片_python使用socket传输图片视频等文件的实现方式
python使用socket传输图片视频等文件的实现方式 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: python使用socket传输图片视频等文件的实现方式 ...
- c语言实现socket转json,C++实现json形式的Socket传输图片
本文实例为大家分享了C++实现json形式的Socket传输图片的具体代码,供大家参考,具体内容如下 大致流程:客户端读取图片,经过Base64编码,转成字符串的形式,保存到json中,通过socke ...
- unity socket传输图片_python3实现socket传输图片
我最近在做一个项目的时候 需要把树莓派上的摄像头拍摄的图片实时传输到我的PC上 我想通过socket完成这个功能 我找了找网上的代码,好多都是python2.x版本的,或者是图片总是传不过来的,只能自 ...
- java socket 传输图片_JAVASOCKET传输图片
JAVASOCKET传输图片 服务器端: Java代码 收藏代码 import ; import ; import ; import ; import ; import ; import ; publ ...
- qt 串口粘包_Qt Socket 传输图片——图像拆包、组包、粘包处理
之前给大家分享了一个使用python发图片数据.Qt server接收图片的Demo.之前的Demo用于传输小字节的图片是可以的,但如果是传输大的图片,使用socket无法一次完成发送该怎么办呢?本次 ...
- Python Socket传输图片
我们在传输数据时,经常使用tcp/ip的服务器和客户端模型,很多设备也经常将网口作为硬件接口预留出来.可以使用tcp/ip传输图像.大的文件等,如果图片过大,还会进行拆分传输,接收方根据对应协议进行解 ...
- python socket传输图片
使用 socket 实现图片传输. # -*- coding=utf-8 -*-""" file: recv.py socket service "" ...
- unity局域网socket传输图片tcp
https://www.bilibili.com/video/bv1iD4y1X7e8 首先打开服务器,然后打开客户端,修改StreamingAssets的ip地址,然后打开客户端,在服务器里面输入图 ...
- python socket传输摄像头画面
实现两台机器之间传输摄像头画面.其中服务端拍摄画面并传输,客户端接收再显示. 传输方法用了之前的socket传输图片.视频就是连续的图片.摄像头画面的采集使用opencv. 1,服务端: #!/usr ...
最新文章
- Java多线程编程实战指南
- QUIC/HTTP2相关资料整理
- [Python]使用 lambda 函数
- pve安装黑群晖直通硬盘_PVE+lede+DSM网卡硬盘直通+win10
- [LeetCode] 513. Find Bottom Left Tree Value_ Medium tag: BFS
- Layui表单账号注册校验密码是否一致
- 未来软件开发的主流方向:规则引擎 (Rule Engine)
- 在 vi 中替换字符串
- 【零知ESP8266教程】快速入门28 六轴传感器模块的使用
- [XCTF] reverse logmein
- idea社区版激活_使用IntelliJ IDEA社区版代替付费版
- 《金阁寺》金阁美之于幻想,我用摧毁它来成就其美
- win7开机卡在正在启动_电脑重装了系统,却卡在图标截面
- 上市公司广告宣传推广费-含沪深A股主板、中小企业板等(2011-2020年)
- 微软修复打印机服务漏洞 所有支持Windows系统都受影响
- webpack中处理css文件
- BackTrack-R2发布
- 【Unreal Engine入门学习笔记第一卷】UE4 C++ UE_LOG及打印字符串在屏幕上
- G16、G24、G32、G36、G60
- java 指针定义_JAVA与指针