android和PC(Python)通过USB(adb模式)基于Socket传输图像(视频)
由于在实验室做项目的需要,参考了博客上的各种代码,然后自己写写改改搞了十几天,今天终于有点模样了,然后分享出来也算是笔记又可以给后面的兄弟分享经验。(可能一时间不会太完善我会一直修改完善,后面工程会分享到我的GitHub,毕竟现在的博客会员太贵)
还是先上代码吧。不过我做的是android作为服务器端(接收显示图像),PC端作为客户端(发送图像)。
1、android服务器端(开发平台是androidstudio):
①权限设置。socket通信是TCP/IP方式,相当于局域网,必须获取网络权限
②部分关键代码。关键代码就是一个线程,因为通信的连接是阻塞机制(开始我也不懂,后来一想也挺简单的,你android端是服务器端,就像你想从别人那儿通过电话得到你中了大奖的消息,此刻别人还没打来电话你就只能坐着干等,一直等就形成了阻塞,等到别人打来电话,电话响了你接通电话就建立了通信。如果主线程也来这样等的话就是让大老板等手下浪费资源,就派一个小弟去等就行了于是建立一个子线程去等),子线程程序(绿色为关键代码,而且服务器端代码和客户端代码颜色对应):
public class SocketServerPictureThread extends Thread { public String Length; //用来放客户端发过来图像的长度 private Socket socket; private int offset=0; private BufferedOutputStream output; //输出流 private BufferedInputStream input; //输入流 @Override public void run() { try { ServerSocket serverSocket = new ServerSocket(9000); //服务器端端口,数据就是在这个端口上 while (true) { socket = serverSocket.accept(); //他就是阻塞,没电话来就一直等,下面都执行不了 //电话一来就建立连接,开始执行下面代码 output=new BufferedOutputStream(socket.getOutputStream()); input=new BufferedInputStream(socket.getInputStream()); Length=readMsgFromSocket(input); //对面发来了图像大小,我好准备空间 send_msg.post(new Runnable() { @Override public void run() { send_msg.setText(Length); //这是为了看到图像大小,线程中必须这样才能显示到UI界面 } }); SendMsg("123"); //随便发送的,让对面知道我收到了长度 byte[] bitmapBuff=new byte[Integer.valueOf(Length)]; //分配放图片的空间 while (offset
2、PC客户端(pycharm平台):
①客户端就简单了,前面不是在等消息嘛,我这边只要给他打电话就行,他那边可能等得有点久了,直接全部代码:
# -*- coding: utf-8 -*-import _threadimport socketimport osdef server_picture_socket(): picture_number = 1 //第几张图像 current_picture_dir = os.path.dirname(os.path.abspath(__file__)) //读取图像的文件地址 while True: client_address = ('127.0.0.1', 5000) client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) //这个就是“拨打电话”了 client_socket.connect(client_address) print("准备发送") if picture_number>3://我一共连续传了3张图,如果多来个几百张就是视频了 picture_number=1 server_picture_path = os.path.join(current_picture_dir, str(picture_number) + ".jpg") print(server_picture_path) while os.path.exists(server_picture_path): server_picture_open = open(server_picture_path, 'rb') file_size = os.stat(server_picture_path).st_size x = str(file_size) client_socket.send(x.encode("UTF-8")) //接通了电话,告诉服务器端你可能要接收 // 的图像大小,让他可以分配放图像空间的大小了,为我准备好包间 eee= client_socket.recv(1024).decode() //晓得服务器端接收到了长度 length = 0 while length != file_size: pictrue_data = server_picture_open.read(1024) client_socket.sendall(pictrue_data) //发送图像数据给服务器端 length += len(pictrue_data) server_picture_open.close() picture_number += 1 re = client_socket.recv(1024).decode() //对面发过来消息他已经接收完图像 client_socket.close() //接收完了呀,你挂了我也挂吧,还有消息就再给你打电话了 break print("发送完毕")if __name__ == '__main__': server_picture_socket()
3、通过USB是android的一个adb,所以要配置端口和adb环境的添加:
环境添加就先在androidstudio的setting中找到SDK文件地址,里面有个adb文件,再在环境变量中添加就行:可百度;
cmd键入 adb 出现该图就添加好了,然后就是端口的匹配:
接着键入 adb forward tcp:5000 tcp:9000 (端口程序中有)
啊,写了接近2个小时,毕竟我的水平有限,不然的话我两天就搞定这个垃圾程序了
后面传到github上,目前觉得有用的可以直接联系我发工程
更多相关文章
- android一键分享功能不使用任何第三方sdk
- Android上超级好用的前端调试方法(adb reverse)
- Android设计模式 观察者模式之eventbus
- android 如何绕过签名校验
- Android上实现仿IOS弹性ListView
- android上传文件至服务器(android端+服务器端)
- 第1个Android应用程序 Android制作简单单页导航
- Android的NoVIP视频解析APP开发完整过程
- 挖掘更合适的MVP模式的架构设计