手把手教你实现python网络聊天程序(进阶版)

1. socket的使用

1.1 socket的创建:

s=socket.socket(AddressFamily,Type)

AddressFamily的可选参数:

可选参数介绍
AF_INET用于Internet进程间通讯
AF_UNIX用于进程间通讯

Type的可选参数:

可选参数介绍
SOCK_STREAM流式套接字,主要用于TCP协议
SOCK_DGRAM数据报套接字,主要用于UDP协议

1.2 socket类的常用方法

常用方法介绍
s.bind((host,port))绑定地址(host,port)到套接字
s.listen()开始TCP监听,可选参数为操作系统可挂起的最大连接数量,至少为1
s.accept()被动接收TCP客户端的连接,用阻塞的方式等待连接到来
s.connect(address)主动初始化TCP服务链接,address格式的元组(hostname,port)若连接出错,则返回socket.error
s.recv(bufsize)接收TCP数据,以字符串形式返回。bufsize指定接收的最大数量
s.send()发送TCP数据,将string中数据发送到连接的套接字,返回值小于等于发送字节数
s.sendall()完整发送TCP数据,成功返回none,失败抛出异常
s.recvfrom()接收UDP数据,返回值为(data,address),data为包含数据的字符串,address为发送数据的地址
s.sendto()发送UDP数据,将数据发送到套接字。(ipaddr,port)元组,指定远程地址。返回发送字节数
s.close()关闭套接字

1.3 socket入门实战

1.3.1 TCP聊天程序(一人一句)的实现思想

1.3.2 TCP聊天程序(一人一句)的实现代码

服务器代码:

import socket
host=127.0.0.1’
port=996
print('服务器IP:'+host+'\n')
print('服务器端口号:'+str(port)+'\n')
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#创建套接字
s.bind((host,port))#绑定ip和port
s.listen(10)#设置最大监听量
sock,addr=s.accept()
print('连接已经建立')
info=sock.recv(1024).decode()
while True:
    if info:
        print('接收到的内容:'+info)
    send_data=input('输入发送内容:')
sock.send(send_data.encode())
info=sock.recv(1024).decode()
sock.close()
s.close()

客户端代码:

import socket
s=socket.socket()
host=127.0.0.1’
port=996
s.connect((host,port))#连接服务器
print('已连接')
info=''
while True:
    send_data=input('输入发送内容:')
    s.send(send_data.encode())
    info=s.recv(1024).decode()
    print('接收的内容:'+info)
s.close()

实现效果:

2.改进我们的程序

现在,我们已经有了一人一句的聊天程序的铺垫,我们可以进一步实现一人可以多句的聊天程序。我们在实现的时候需要使用以下一些模块:tkinter和threading。主要思想为:每台电脑同时作为服务器和客户端,服务器只负责循环接收消息 ,而客户端只负责发送消息。

2.1改进后的思想

2.2 threading模块的使用

2.2.1 多线程的创建

thread ([group[,target[,name[,args[,kwarges]]]]])

2.2.2thread的参数介绍

参数介绍
group值为none
target表示一个可调用对象
name当前线程名称
args传递给target函数的一个参数元组
kwargs传递给target函数的一个参数字典

2.2.3 threading的使用

我们在这个程序中只需要创建threading.thread的子类即可,示例:

import threading
class SubThread(threading.Thread):
    def run(self):
        pass#重写run方法
if __name__ == '__main__':
	p1 = SubThread()
	p1.start()

2.3tkinter模块的使用

我们在这个程序中需要使用一个按钮(Button),一个列表框(Listbox)和一个输入框(Entry),示例:

from tkinter import *
root = Tk()
v = StringVar()
thebutton = Button(root, text="send", command=send)
thebutton.grid(row=11, column=5)
thelist = Listbox(root)
thelist.grid(row=0, column=1, rowspan=10, columnspan=5)
thelist.insert(END, '1st tk')
theentry = Entry(root, textvariable=v)
theentry.grid(row=11, column=1, columnspan=4)
mainloop()

2.4最终代码

first.py

import socket
import threading
from tkinter import *


class SubThread(threading.Thread):
    def run(self):
        s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s1.bind(('127.0.0.1', 996))

        while True:
            s1.listen(10)
            sock, addr = s1.accept()
            info = sock.recv(1024).decode()
            global thelist
            thelist.insert(END, 'ta:' + info)


def send():
    s2 = socket.socket()
    s2.connect(('127.0.0.1', 669))
    global v
    s2.send(v.get().encode())
    global thelist
    thelist.insert(END, 'me:' + v.get())
    v.set('')


if __name__ == '__main__':
    root = Tk()
    v = StringVar()
    thebutton = Button(root, text="send", command=send)
    thebutton.grid(row=11, column=5)
    thelist = Listbox(root)
    thelist.grid(row=0, column=1, rowspan=10, columnspan=5)
    thelist.insert(END, '1st tk')
    theentry = Entry(root, textvariable=v)
    theentry.grid(row=11, column=1, columnspan=4)
    p1 = SubThread()
    p1.start()
    mainloop()

second.py

import socket
import threading
from tkinter import *


class SubThread(threading.Thread):
    def run(self):
        s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s1.bind(('127.0.0.1', 669))

        while True:
            s1.listen(10)
            sock, addr = s1.accept()
            info = sock.recv(1024).decode()
            global thelist
            thelist.insert(END, 'ta:' + info)


def send():
    s2 = socket.socket()
    s2.connect(('127.0.0.1', 996))
    global v
    s2.send(v.get().encode())
    global thelist
    thelist.insert(END, 'me:' + v.get())
    v.set('')


if __name__ == '__main__':
    root = Tk()
    v = StringVar()
    thebutton = Button(root, text="send", command=send)
    thebutton.grid(row=11, column=5)
    thelist = Listbox(root)
    thelist.grid(row=0, column=1, rowspan=10, columnspan=5)
    thelist.insert(END, '2nd tk')
    theentry = Entry(root, textvariable=v)
    theentry.grid(row=11, column=1, columnspan=4)
    p1 = SubThread()
    p1.start()
    mainloop()
  • 11
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
人脸识别是一种基于图像处理和模式识别技术的应用,能够自动识别图像中的人脸,并对其进行识别和分类。Python是一种功能强大的编程语言,可以用来实现人脸识别程序。 以下是一个使用Python实现人脸识别的简单步骤: 1. 安装OpenCV库:OpenCV是一个广泛使用的计算机视觉库,可用于处理图像和视频数据。在Python中,可以使用pip命令安装OpenCV库,如下所示: ``` pip install opencv-python ``` 2. 收集人脸图像:需要收集一组人脸图像,用于训练人脸识别模型。可以使用摄像头或从文件中读取图像。 3. 训练人脸识别模型:使用Python编写代码,使用OpenCV库训练人脸识别模型。OpenCV库提供了许多不同的人脸识别算法,例如Eigenfaces、Fisherfaces和LBPH算法等。 4. 测试:使用训练好的模型进行人脸识别。可以使用摄像头或从文件中读取图像,然后将其传递给人脸识别模型进行识别。 下面是一个简单的Python程序,用于实现人脸识别: ```python import cv2 # 加载人脸识别器 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 加载训练好的人脸识别模型 recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.read('trainer.yml') # 打开摄像头 cap = cv2.VideoCapture(0) while True: # 从摄像头中读取图像 ret, img = cap.read() # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 检测人脸 faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: # 绘制矩形框 cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) # 识别人脸 id, confidence = recognizer.predict(gray[y:y+h,x:x+w]) # 显示识别结果 if confidence < 70: cv2.putText(img, "Name: " + str(id), (x+5,y-5), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 2) else: cv2.putText(img, "Unknown", (x+5,y-5), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 2) # 显示图像 cv2.imshow('Face Recognition',img) # 按下q键退出程序 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头并关闭窗口 cap.release() cv2.destroyAllWindows() ``` 上述代码中,首先加载了人脸识别器和训练好的人脸识别模型,然后打开摄像头,不断读取摄像头中的图像。使用人脸识别器检测图像中的人脸,然后使用训练好的模型进行识别。如果识别结果可信度高于70%,则显示人名,否则显示未知。最后,将识别结果显示在图像中,并等待用户按下q键退出程序。 注意,在使用OpenCV库进行人脸识别时,需要使用训练好的模型进行识别。可以使用OpenCV提供的许多不同的算法来训练人脸识别模型,例如Eigenfaces、Fisherfaces和LBPH算法等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值