使用python代码编写服务端代码,使用Android、java语言进行图片发送 ,java对java的socket连接很容易,但是java和python之间的socket连接就蒙蔽了,记录一下。
package com.example.qing.socketsendimage;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
public class MainActivity extends AppCompatActivity {
Button sendImage;
ImageView imageview;
public void sendTextMsg(DataOutputStream out, String msg) throws IOException {
byte[] bytes = msg.getBytes();
long len = bytes.length;
//先发送长度,在发送内容
out.writeLong(len);
out.write(bytes);
}
public void sendImgMsg(DataOutputStream out ) throws IOException {
//发送的图片为图标,就是安卓机器人,将bitmap转为字节数组
Log.i("sendImgMsg", "len: "+"1");
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
Log.i("sendImgMsg", "len: "+"2");
ByteArrayOutputStream bout = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG,80,bout);
//写入字节的长度,再写入图片的字节
long len = bout.size();
//这里打印一下发送的长度
Log.i("sendImgMsg", "len: "+len);
out.write(bout.toByteArray());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendImage=(Button)findViewById(R.id.buttonSend);
imageview=(ImageView)findViewById(R.id.image1);
sendImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread() {
Socket socket;
String host="192.168.91.1";
int post=8999;
public void run() {
try {
//建立连接
socket = new Socket(host, post);
//获取输出流,通过这个流发送消息
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
//发送文字消息
// sendTextMsg(out,"来自手机客户端的消息");
sendImgMsg(out);
out.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//启动线程
}.start();
}
});
}
}
import socketserver
import datetime
import base64
import numpy as np
import cv2
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
print("get....")
image1 = []
try:
while True:
data=self.request.recv(1024) #拿到客户端发送的数据
print('data,',data)
# data = base64.b64decode(data)
if not data or len(data) == 0:
break
image1.extend(data)
print("get over")
image = np.asarray(bytearray(image1), dtype="uint8")
# print("1", image)
# print("2",len(image)) 39559
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
# cv2.imwrite("./tes4333.jpg", image)
cv2.namedWindow("Image")
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
print("接收完成")
self.request.sendall("get your connet!".encode("utf-8"))
except Exception:
print(self.client_address,"连接断开")
finally:
self.request.close() #异常之后,关闭连接
#before handle,连接建立:
def setup(self):
now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(now_time)
print("连接建立:",self.client_address)
# finish run after handle
def finish(self):
print("释放连接")
if __name__=="__main__":
HOST,PORT = "",8999
# server=socketserver.TCPServer((HOST,PORT),MyTCPHandler) #实例对象,传入参数
# 多线程
server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever() #一直运行