Android的socket通信基本实现请参考:
https://blog.csdn.net/Sunxiaolin2016/article/details/90715331
在文章《Android P的Socket通信实现》中主要实现了一个socket通信,通过读写一个txt文本去传输一些数据信息。
本文主要记录传输一张图片信息。
一、创建客户端
protected void connectSocket() {
Socket socket;
try {
// 创建一个Socket对象,并指定服务端的IP及端口号
socket = new Socket("127.0.0.1", 9821);
DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
//发送的图片为demo.jpg,将bitmap转为字节数组
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.demo);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG,100,bout);
//写入字节的长度,再写入图片的字节
long len = bout.size();
//这里打印一下发送的长度
Log.i("sendImgMsg", "len: "+len);
outputStream.writeLong(len);
outputStream.write(bout.toByteArray());
//发送成功
Log.i("ServerReceviedByTcp","outputStream.write ok" );
// 发送读取的数据到服务端
outputStream.flush();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
二、创建服务器端
public void createServerRecevied() {
// 声明一个ServerSocket对象
ServerSocket serverSocket = null;
try {
// 创建一个ServerSocket对象,并让这个Socket在9821端口监听
serverSocket = new ServerSocket(9821);
// 调用ServerSocket的accept()方法,接受客户端所发送的请求,
// 如果客户端没有发送数据,那么该线程就停滞不继续
Socket socket = serverSocket.accept();
DataInputStream inputStream = new DataInputStream(socket.getInputStream());
//同样是先读长度
long len = inputStream.readLong();
System.out.println("len = " + len);
byte[] bytes = new byte[(int) len];
//然后在读这个长度的字节到字节数组
inputStream.readFully(bytes);
//将独到的内容保存为文件到本地
File file = new File("/data/local/tmp/" + len + ".png");
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(bytes);
//接收成功 在/data/local/tmp/下面可以看到生成的png格式图片
Log.i("ServerReceviedByTcp","fileOutputStream.read ok" );
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
三、总结
需要修改/data/local/tmp/的权限,否则保存图片失败。
adb shell chmod 777 /data/local/tmp