关于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() {
            @Override
            public 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


  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以使用以下步骤来利用socket传输图片: 1. 在发送端,打开图片文件并读取其内容。 2. 将读取到的图片数据转换为二进制数据,并将其发送到接收端。 3. 在接收端,接收二进制数据并将其转换为图片格式。 4. 将图片数据保存到本地文件中。 以下是一个简单的Python示例代码,演示如何使用socket传输图片: 发送端代码: ```python import socket # 打开图片文件并读取其内容 with open('image.jpg', 'rb') as f: img_data = f.read() # 创建socket对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 server_address = ('localhost', 5000) client_socket.connect(server_address) # 发送图片数据 client_socket.sendall(img_data) # 关闭socket连接 client_socket.close() ``` 接收端代码: ```python import socket # 创建socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定IP地址和端口号 server_address = ('localhost', 5000) server_socket.bind(server_address) # 开始监听客户端连接请求 server_socket.listen(1) # 等待客户端连接 print('等待客户端连接...') client_socket, client_address = server_socket.accept() print('客户端已连接:', client_address) # 接收图片数据 img_data = b'' while True: data = client_socket.recv(1024) if not data: break img_data += data # 将图片数据保存到本地文件中 with open('image.jpg', 'wb') as f: f.write(img_data) # 关闭socket连接 client_socket.close() server_socket.close() ``` 在以上示例代码中,发送端通过打开图片文件并读取其内容,将图片数据转换为二进制数据,并通过socket连接发送给接收端。接收端通过创建一个socket对象并绑定IP地址和端口号,等待客户端连接请求,并在接收到连接请求后,接收图片数据并将其保存到本地文件中。最后,关闭socket连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值