socket编程-多个客户端向服务器发送人脸照片,服务器返回识别结果(服务器使用多线程)...
recognition.py
import numpy as np
import face_recognition
import os class recognition:
def __init__(self):
file_handle = open('picture_name.txt', 'r')
nameStr = file_handle.readline().strip()
self.total_image_name = nameStr.split(' ')
file_handle.close()
codeArray = np.loadtxt('picture_encode.txt')
self.total_face_encoding = list(codeArray) def startRecog(self, path):
image_code_list, numOfImages = self.readImage(path)
if numOfImages != 3:
return 'failed'
else:
#3.进行识别,将识别结果保存在一个字符串列表中
result_list = []
for i in range(numOfImages):
for k, v in enumerate(self.total_face_encoding):
match = face_recognition.compare_faces([v], image_code_list[i][0], tolerance=0.5)
name = 'unknown'
if match[0]:
name = self.total_image_name[k]
result_list.append(name)
break #4.如果数组中有两个相同的元素,就将该元素返回给客户端
print(result_list)
item1 = result_list[0]
item2 = result_list[1]
item3 = result_list[2]
if item1 == item2 and item1 == item3 and item1 != 'unknown':
return item1
elif (item1 == item2 and item1 != 'unknown') or (item1 == item3 and item1 != 'unknown'):
return item1
elif item2 == item3 and item2 != 'unknown':
return item2
else:
return 'failed' def readImage(self, path):
image_code_List = []
imageList = os.listdir(path) for image in imageList:
newPath = path + '/' + image
image_code_List.append(face_recognition.face_encodings(face_recognition.load_image_file(newPath)))
return image_code_List, len(imageList)
服务器端:
import socket
import threading
import os
import recognition class recogServer:
def __init__(self):
print('启动服务')
self.sock = socket.socket() #创建socket
self.addr = ('127.0.0.1',9999) #服务器要绑定的IP和端口
self.sock.bind(self.addr) #绑定IP和端口 有一个端口已占用的问题
self.clients = {}
self.recognition = recognition.recognition() def start(self):
self.sock.listen()
accept_thread = threading.Thread(target=self.accept, name='accpet_thread')
accept_thread.start() def accept(self):
while True:
s, raddr = self.sock.accept()
self.clients[raddr] = s
recv_thread = threading.Thread(target=self.recv, name='recv_thread', args=(s, raddr))
recv_thread.start() def recv(self, s, raddr):
clientStr = raddr[0] + '-' + str(raddr[1])
clientDir = 'recvImage/' + clientStr
self.makeDir(clientDir) #为每一个客户端建立一个文件夹,用来保存图片 while True:
try:
data = s.recv(1024).decode()
if data == 'end': #图片发送完毕,退出接收图片的循环
break
if len(data): #判断是否接收到了数据
fileName,length = data.split('|')
#if fileName and length:
total_length = int(length)
newFile = open(clientDir + '/' + fileName,'wb')
s.send(b'ok') get = 0
file = b''
while get < total_length:
fileData = s.recv(1024)
file = file + fileData
get = get + len(fileData) if len(file) == total_length:
newFile.write(file[:])
s.send(b'continue')
newFile.close() except ConnectionResetError:
print('error')
s.close()
s.send(b'successfully received') #将图片全部接收完毕后,给客户端一个响应
personName = self.recognition.startRecog(clientDir)
s.send(personName.encode())
print(personName) def makeDir(self, path):
path = path.strip()
if not os.path.exists(path):
os.mkdir(path) def stop(self):
for item in self.clients.values():
item.close()
self.sock.close() if __name__ == '__main__':
myserver = recogServer()
myserver.start() while True:
input_str = input('>>>')
if input_str.strip() == 'quit':
myserver.stop()
break
print(threading.enumerate())
客户端:
import socket
import os class client:
def __init__(self):
self.fileList = [] # 存图片的bytes数组
self.addr = ('127.0.0.1', 9999)
self.sock = socket.socket()
self.sock.connect(self.addr) def readFile(self, dir_path):
self.nameList = os.listdir(dir_path)
for item in self.nameList:
file_path = dir_path + item
print(file_path)
self.fileList.append(self.read(file_path)) def read(self, file_path):
file_handle = open(file_path, 'rb')
data = file_handle.read()
file_handle.close()
return data def send_pic(self):
pic_num = len(self.nameList) for i in range(pic_num):
total_length = len(self.fileList[i])
msg = '{}|{}'.format(self.nameList[i], total_length)
self.sock.send(msg.encode())
ok_data = self.sock.recv(1024)
if ok_data.decode() == 'ok':
current = 0
while current < total_length:
send_data = self.fileList[i][current:current+1024]
self.sock.send(send_data)
current = current + len(send_data)
continue_data = self.sock.recv(1024)
if continue_data.decode() == 'continue':
pass
self.sock.send(b'end')
over = self.sock.recv(1024)
print(over.decode())
name = self.sock.recv(1024)
print(name.decode()) if __name__ == '__main__':
#path = 'image/'
path = input('Input the path:') #例如当前目录下'image/2/'
path.strip()
myclient = client()
myclient.readFile(path)
myclient.send_pic()
转载于:https://www.cnblogs.com/ACPIE-liusiqi/p/10648155.html
socket编程-多个客户端向服务器发送人脸照片,服务器返回识别结果(服务器使用多线程)...的更多相关文章
- linux socket编程:简易客户端与服务端
什么是socket? socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来 ...
- android下socket编程问题:服务器关闭时,客户端发送请求的异常处理
我用socket分别创建了一个服务器和一个客户端. 当服务器程序运行时,客户端和服务器发送接收数据是OK的. 但是,如果服务器程序关闭以后,客户端仍然发送请求的话,会抛出一个IOException.但 ...
- 循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)
目录[-] 一.TCP/IP协议 二.TCP与UDP 三.Socket是什么 四.Java中的Socket 五.基本的Client/Server程序 六.多客户端连接服务器 七.信息共享 八.文件传输 ...
- 循序渐进Socket网络编程(多客户端、信息共享、文件传输)
循序渐进Socket网络编程(多客户端.信息共享.文件传输) 前言:在最近一个即将结束的项目中使用到了Socket编程,用于调用另一系统进行处理并返回数据.故把Socket的基础知识总结梳理一遍. 1 ...
- socket编程中客户端常用函数
1 常用函数 1.1 connect() int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen); 客 ...
- 5.1 socket编程、简单并发服务器
什么是socket? socket可以看成是用户进程与内核网络协议栈的编程接口.是一套api函数. socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机间的进程间通信. 工业上使用的为t ...
- socket编程中客户端常用函数 以及简单实现
1 常用函数 1.1 connect() int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen); 客 ...
- Linux Socket编程
“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...
- Linux Socket编程(不限Linux)【转】
转自:http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几 ...
随机推荐
- stm32:简单按键输入实现
开发环境keil4,芯片STM32F103C8T6 1.main.c //串口实验 #include "sys.h" #include "delay.h" #i ...
- PTA数据结构与算法题目集(中文) 7-4
PTA数据结构与算法题目集(中文) 7-4 是否同一颗二叉搜索树 给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, ...
- 使用Putty登录亚马逊云主机
亚马逊云主机配置之后会提示 提供一个 pem证书, 打开 SSH 客户端.(了解操作方法 使用 PuTTY 连接) 找到您的私有密钥文件(test001.pem).向导会自动检测您用于启动实例的密钥. ...
- 分享layui的table的一些小技巧,前端分页
最近一直在折腾报表,期间使用了layui的table做展示(版本号:2.5.5) 起初:以为是查询结果出来后,前端和服务端分页一弄就完事了,参考例子,但是sql写得太长太长了,翻页困难,数据库是老旧的 ...
- es实现mysql的like查询
es版本6.8 因为阿里云的dts同步最高支持es版本就是6.8 构建索引 PUT /z_test/ { "mappings": { "doc": { &quo ...
- python3(十六)returnFunc
# 通常求和函数定义,调动就求和 def calc_sum(*args): ax = 0 for n in args: ax = ax + n return ax # 如果不需要立即求和 def la ...
- PyCharm 项目打开窗口设置为当前还是新开一个怎么办?
前言: 我找这个设置找了好久,后来在一篇博文中才找到,现在记录下来一下,顺便带图解释一下 设置步骤: File -> Setting -> Appearance & ...
- SQL Server 2005 sa登录失败。已成功与服务器建立连接 但是在登录过程中发生错误。 provider 共享内存提供程序 error 0 管道的另一端上无任何进程。
SQL Server 2005 Express版 用户 'sa' 登录失败.该用户与可信 SQL Server 连接无关联.提示错误:已成功与服务器建立连接 但是在登录过程中发生错误. provide ...
- stand up meeting 11/26/2015
part 组员 今日工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云 完成UI简易界面布局设计:在UI部分实现释义数据格式转换的实现和测试,使得其与外界接口均标准化为string,具体实现见 ...
- D - Leading and Trailing LightOJ - 1282
题解:求n^k的前三位和后三位. 后三位直接快速幂对1000去余就可以了.前三位可以转换成浮点数来操作,也是用快速幂,我们只保留答案的前三位,当前值大于1000.0的话就除以10,直到结果小于等于10 ...