客户端与服务端发送数据
时间:2019-11-23
本文章向大家介绍客户端与服务端发送数据,主要包括客户端与服务端发送数据使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
client端
1 import socket 2 import os 3 import sys 4 import struct 5 #import cv2 6 #import tkinter as tk 7 from tkinter import filedialog 8 from picamera import PiCamera 9 from time import sleep 10 11 #capture = cv2.VideoCapture(0) 12 def take_photo(): 13 camera = PiCamera() 14 camera.start_preview() 15 camera.capture("./image0.jpg") 16 camera.stop_preview() 17 18 def take_video(): 19 camera = PiCamera() 20 camera.start_preview() 21 camera.start_recording("./video.h264") 22 sleep(10) 23 camera.stop_recording() 24 camera.stop_preview() 25 26 def socket_client(a): 27 try: 28 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 29 s.connect(('192.168.43.43', 6666)) # 服务器的ip及设置端口号 30 except socket.error as msg: 31 print(msg) 32 sys.exit(1) 33 34 print(s.recv(1024).decode("utf-8")) 35 36 #root = tk.Tk() 37 #root.withdraw() 38 if a == 1: 39 filepath = "./image0.jpg" 40 elif a == 2: 41 filepath = "./video.h264" 42 print(filepath) 43 if os.path.isfile(filepath): 44 # 定义定义文件信息。128s表示文件名为128bytes长,l表示一个int或log文件类型,在此为文件大小 45 fileinfo_size = struct.calcsize('128sl') 46 # 定义文件头信息,包含文件名和文件大小 47 fhead = struct.pack( 48 '128sl', 49 os.path.basename(filepath).encode(encoding="utf-8"), 50 os.stat(filepath).st_size 51 ) 52 print('client filepath: {0}'.format(filepath)) 53 s.send(fhead) 54 55 fp = open(filepath, 'rb') 56 while 1: 57 data = fp.read(1024) 58 if not data: 59 print('{0} file send over...'.format(filepath)) 60 break 61 s.send(data) 62 os.remove(filepath) 63 64 65 print(s.recv(1024).decode("utf-8")) 66 print(s.recv(1024).decode("utf-8")) 67 s.close() 68 69 70 71 if __name__ == '__main__': 72 while True: 73 userinput = int(input("请输入你想要的功能 1 拍照传输图片 2 摄像传输视频:")) 74 if userinput == 1: 75 take_photo() 76 socket_client(userinput) 77 elif userinput == 2: 78 take_video() 79 socket_client(userinput) 80 else: 81 print("未知错误,重新输入") 82 userinput = int(input("请输入你想要的功能 1 拍照传输图片 2 摄像传输视频:"))
serve端
1 import socket 2 import threading 3 import sys 4 import os 5 import struct 6 7 8 def socket_service(): 9 try: 10 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 11 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 12 s.bind(('192.168.43.43', 6666)) # 服务器的ip及设置端口号 13 s.listen(10)# 10 表示 限制服务端同一时刻所能接受客户端连接请求的个数。 14 except socket.error as msg: 15 print(msg) 16 sys.exit(1) 17 print('Waiting connection...') 18 19 while 1: 20 conn, addr = s.accept() 21 # 返回值是一个新的套接字描述符,它代表的是和客户端的新的连接, 22 # 可以把它理解成是一个客户端的socket, 这个socket包含的是客户端的ip和port信息 。 23 # (当然这个new_socket会从sockfd中继承服务器的ip和port信息,两种都有了), 24 # 而参数中的SOCKET s包含的是服务器的ip和port信息 。 25 26 27 t = threading.Thread(target=deal_data, args=(conn, addr)) 28 t.start() 29 30 31 def deal_data(conn, addr): 32 print('Accept new connection from {0}'.format(addr)) 33 print(conn) 34 conn.send('Hi, Welcome to the server!'.encode("utf-8")) 35 36 while 1: 37 fileinfo_size = struct.calcsize('128sl') 38 buf = conn.recv(fileinfo_size) 39 if buf: 40 filename, filesize = struct.unpack('128sl', buf) 41 fn = filename.strip(b"\x00").decode("utf-8") #将文件名中的 图片名字 提取出来 42 #strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列 43 new_filename = os.path.join('./', 'new_' + fn) 44 print(new_filename, filesize) 45 print('file new name is {0}, filesize if {1}'.format(new_filename, filesize)) 46 47 recvd_size = 0 # 定义已接收文件的大小 48 fp = open(new_filename, 'wb') 49 print('start receiving...') 50 51 while not recvd_size == filesize: 52 if filesize - recvd_size > 1024: 53 data = conn.recv(1024) 54 recvd_size += len(data) 55 else: 56 data = conn.recv(filesize - recvd_size) 57 recvd_size = filesize 58 fp.write(data) 59 fp.close() 60 print('end receive...') 61 conn.send('已发送'.encode("utf-8")) 62 print(conn.recv(1024).decode('utf-8')) 63 conn.close() 64 break 65 66 67 if __name__ == '__main__': 68 socket_service()
原文地址:https://www.cnblogs.com/liuming-nimi/p/11917775.html
- 最近处理的几个小问题_20160311 (r8笔记第35天)
- Hibernate_day02总结
- Hibernate_day01总结
- ADG备库批量查询失败的原因分析(r8笔记第33天)
- 通过外部表改进一个繁琐的大查询 (r8笔记第32天)
- 一个简单的bigfile tablespace无法扩展的案例处理 (r8笔记第31天)
- 测试环境的迁移式升级和数据整合(r8笔记第27天)
- 增量数据丢失的原因分析(r8笔记第26天)
- Java全栈开发Spring学习第三天
- 一个oracle bug的简单验证(r8笔记第45天)
- 批量导出csv文件的基本尝试(r8笔记第44天)
- Golang 中的并发限制与超时控制
- 一条简单的报警信息发现的oracle bug(r8笔记第42天)
- 一条insert语句导致的性能问题分析(一)(r8笔记第40天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [GO] 变参函数-GO中函数传递变长参数
- 基于Android-Skin-Loader实现换肤效果
- 通过 Nginx 实现最简单的Nas服务器(文件分享)
- 解决Android Studio xml 格式化不自动换行的问题
- GitHub代码仓库服务的那些事
- Android之自定义实现BaseAdapter(通用适配器三)
- Android实现音乐播放器锁屏页
- android studio3.3.1代码提示忽略大小写的设置
- Ascgen2可以把图片变成文字的小工具
- 解决android studio卡顿,提升studio运行速度的方法
- Android物理键盘事件解析
- AndroidQ(10)分区存储完美适配方法
- (全局快捷键工具)Power Keys彻底提升码字效率?
- android自定义view实现钟表效果
- 教你如何用OpenVZ限制虚拟机硬盘IO速度