由于公司要做一个手机间传输图片的功能,网上的资料又太过杂乱,没有达到我想要的效果,于是自己前前后后折腾了好久,终于把这个功能做出来,现在分享出来。话不多说,上代码。

服务端代码

/*
服务器端接收数据
服务器应该要多线程,一个服务器可能会有多个客户端进行连接;
*/
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传输图片相关推荐

  1. python socket传输图片_python使用socket传输图片视频等文件的实现方式

    python使用socket传输图片视频等文件的实现方式 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  python使用socket传输图片视频等文件的实现方式 ...

  2. c语言实现socket转json,C++实现json形式的Socket传输图片

    本文实例为大家分享了C++实现json形式的Socket传输图片的具体代码,供大家参考,具体内容如下 大致流程:客户端读取图片,经过Base64编码,转成字符串的形式,保存到json中,通过socke ...

  3. unity socket传输图片_python3实现socket传输图片

    我最近在做一个项目的时候 需要把树莓派上的摄像头拍摄的图片实时传输到我的PC上 我想通过socket完成这个功能 我找了找网上的代码,好多都是python2.x版本的,或者是图片总是传不过来的,只能自 ...

  4. java socket 传输图片_JAVASOCKET传输图片

    JAVASOCKET传输图片 服务器端: Java代码 收藏代码 import ; import ; import ; import ; import ; import ; import ; publ ...

  5. qt 串口粘包_Qt Socket 传输图片——图像拆包、组包、粘包处理

    之前给大家分享了一个使用python发图片数据.Qt server接收图片的Demo.之前的Demo用于传输小字节的图片是可以的,但如果是传输大的图片,使用socket无法一次完成发送该怎么办呢?本次 ...

  6. Python Socket传输图片

    我们在传输数据时,经常使用tcp/ip的服务器和客户端模型,很多设备也经常将网口作为硬件接口预留出来.可以使用tcp/ip传输图像.大的文件等,如果图片过大,还会进行拆分传输,接收方根据对应协议进行解 ...

  7. python socket传输图片

    使用 socket 实现图片传输. # -*- coding=utf-8 -*-""" file: recv.py socket service "" ...

  8. unity局域网socket传输图片tcp

    https://www.bilibili.com/video/bv1iD4y1X7e8 首先打开服务器,然后打开客户端,修改StreamingAssets的ip地址,然后打开客户端,在服务器里面输入图 ...

  9. python socket传输摄像头画面

    实现两台机器之间传输摄像头画面.其中服务端拍摄画面并传输,客户端接收再显示. 传输方法用了之前的socket传输图片.视频就是连续的图片.摄像头画面的采集使用opencv. 1,服务端: #!/usr ...

最新文章

  1. (转)C# 3.0 LINQ 的演变及其对 C# 设计的影响
  2. Grinder搭建小记与Nduja(这次不待续了)
  3. 《HeadFirst设计模式》笔记
  4. 计算机视觉界CV牛人牛事
  5. matlab中云模型,云模型简介与个人理解matlab程序.doc
  6. 用js实现鼠标点击爱心特效
  7. 计算机系统-电路设计02-与门电路
  8. python注意事项
  9. c++11新特性的使用---可变模板参数、type_traits、function综合使用
  10. 【论文解读】ICLR2021 知识建模与信息抽取
  11. tick_init 函数
  12. 协议rs485协议,串口通讯(转发)
  13. c11语言编译器,GNU C编译器的gnu11和c11
  14. UDP之socket编程实例
  15. 微信小程序view居中问题
  16. xdg在Linux中的用法,Linux – XDG (X Desktop Group)
  17. 1.1 机器人学之空间描述和变换
  18. 如何通过maven官网查询相关依赖的具体代码和版本?
  19. 文件数字签名校验与信息获取
  20. 远程桌面协议(RDP)工具 FreeRDP

热门文章

  1. Boss直聘使用技巧 – 求职面试 – 被面技巧
  2. 22部漫威电影大合集和观影顺序
  3. 机器学习系列(三)——EM算法
  4. 内地移动支付全球领先?醒醒吧,香港在这5个方面已赶超内地了!
  5. 没有公网IP,自建网站如何让外网访问?
  6. 树型结构的四种建模方法
  7. 倍福beckhoff知识库
  8. 电脑显示器屏幕看不清灰色,灰色部分都几乎呈现白色状态的解决办法。
  9. python怎么做大数据_python可以做大数据
  10. 不推荐二周目跑重复剧情 不推荐开混10,建议开混11,游戏文本的奖励减半并没有生效. 混10=混11+混乱词条 1.经济获取(学自大佬:小小银Salmon【B站号】) 金币获取:刚通关开混乱11,拿主