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!” 话虽些许夸张,但是事实也是,现在的网络编程几 ...
随机推荐
- 个推IGt.BaseTemplate.php,不仅有bug,还有bom头,好恶心!
错误截图,提交吧,还有一个不明飞行物. 去掉utf-8 BOM:set nobomb保留utf-8 BOM:set bomb
- 在Android Studio中导入jar包
#1 下载jar包文件, #2 拷贝到libs目录下 #3 打开你的build.gradle,在dependencies加入如下代码 dependencies {compile files('libs ...
- php 分页使用limit还是用mysql_data_seek()呢?
目前大部分教程中介绍的时LIMIT方法,使用这种方法要认识到以下几点: (1)limit不是标准的sql语句; (2)如果选择使用limit,那么您就必须首先向数据库发送一个查询语句来获取记录的总数, ...
- Windows&linux使用集成环境搭建 web 服务器
文章更新于:2020-02-17 按照惯例,需要的文件附上链接放在文首 文件名:phpStudy_64.7z 文件大小:78.3 M 下载链接https://www.lanzous.com/i9c6l ...
- 9.1 ArrayList(集合)的使用,与array(数组)的对比
1.array 和ArrayList的区别? array 数组的长度是固定的,适应不了变化的需求. ArrayList集合的长度可变.大小可变. 2.为什么要用集合,它优点是什么? java是面向对象 ...
- spring 管理事务配置时,结果 报错: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here这个异常
java.lang.IllegalStateException: No Hibernate Session bound to thread, and configuration does not al ...
- OSI 七层模型以及TCP/IP模型
OSI 七层模型 定义 OSI(Open System Interconnection)即开放式系统互联通信参考模型.该模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一 ...
- 泛型方法或泛型类中的方法是内部调用、PInvoke 或是在 COM 导入类中定义的。
泛型基类中引用Api函数定义时static extern,在子类中会提示: 未处理TypeLoadException 泛型方法或泛型类中的方法是内部调用.PInvoke 或是在 COM 导入类中定义的 ...
- L11注意力机制和Seq2seq模型
注意力机制 在"编码器-解码器(seq2seq)"⼀节⾥,解码器在各个时间步依赖相同的背景变量(context vector)来获取输⼊序列信息.当编码器为循环神经⽹络时,背景变量 ...
- stand up meeting 11/27/2015-11/29/2015
part 组员 今日工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云 确定释义显示方案并进行代码实现: 4 完成UI设计的各项动能按钮的代码实现 6 数据库 朱玉影 导入了4 ...