pyside2入门–药品管理ui2.0,socket通信,并发线程,加密通信

pyside2入门–药品管理ui2.0,socket通信,并发线程,加密通信

以后需要改进:socket聊天室的应用,占用端口问题解决,指定用户通信。

一、搭建环境

from socket import *
from threading import Thread,Lock
from cryptography.fernet import Fernet#这个需要下载,其他都是内置的

二、实验结果
1、基本介绍
pyside2入门–药品管理ui2.0,socket通信,并发线程,加密通信_第1张图片2、连接即分发key
pyside2入门–药品管理ui2.0,socket通信,并发线程,加密通信_第2张图片3、加密通信。暂时只做到了一发一收。以后再改进!!!一用户一个线程
pyside2入门–药品管理ui2.0,socket通信,并发线程,加密通信_第3张图片pyside2入门–药品管理ui2.0,socket通信,并发线程,加密通信_第4张图片
4、退出连接,退出了以后重启会占用端口而无法运行,以后改进。

pyside2入门–药品管理ui2.0,socket通信,并发线程,加密通信_第5张图片
5、导出日志

pyside2入门–药品管理ui2.0,socket通信,并发线程,加密通信_第6张图片三、代码分析

贴了一部分思路,随意补充把,加油!!!

1、加解密代码
这里有全的

from cryptography.fernet import Fernet
key = Fernet.generate_key()
self.ui.keys.append((str(addr), key))
f = Fernet(key)

2、socket通信代码
使用了一个全局变量。因为要保证key对应,所以暂时只想到调用一个全局变量,如果不为空,加密发送。

    def jiami(self):
        self.ui.mingwen=(self.ui.lineEdit_7.text()).encode()

3、多线程代码
这里可以学学:1、基本 2、注意看他最后的思路。聊天室3、注意事项。
多线程就是多运行了几个程序。几个死循环程序。服务器首先开一个线程进行监听(不开线程,死循环会把其他功能搞崩),来一个用户又开一个线程。
用户程序额外开一个线程,进行监听信息。

这是服务器的线程和socket通信,用户差不多。

    def lianjie(self):
        IP = '127.0.0.2'
        PORT = 50000

        def dataout(dataSocket, addr):
            key = Fernet.generate_key()
            self.ui.keys.append((str(addr), key))
            f = Fernet(key)
            dataSocket.send(key)
            while True:
                if self.ui.mingwen!=b'':# 从终端读入用户输入的字符串
                    if self.ui.mingwen== b'exit':
                        self.ui.listWidget_2.addItem(f'>>>服务器退出,' + str(datetime.today()))
                        break
                    # else:
                    #     lock.acquire()
                    try:
                        s = f.encrypt(self.ui.mingwen)
                        dataSocket.send(f'服务端发送:{s}'.encode())  # 发送消息,也要编码为 bytes
                        self.ui.listWidget_2.addItem(f'>>>服务器发送消息成功成功,'+str(datetime.today()))
                        #self.ui.lineEdit_7.clear()
                        self.ui.mingwen=b''
                        #lock.release()
                    except:
                        self.ui.listWidget_2.addItem(f'>>>服务器发送消息成功失败,'+str(datetime.today()))
                        #self.ui.lineEdit_7.clear()
                        self.ui.mingwen=b''
                        #lock.release()
            dataSocket.close()
        #BUFLEN = 512
        # def datain(dataSocket,addr):
        #     while True:
        #         recved = dataSocket.recv(BUFLEN)
        #         if not recved:# 当对方关闭连接的时候,返回空字符串
        #             print(f'客户端{addr} 关闭了连接' )
        #             break
        #         info = recved.decode()# 读取的字节数据是bytes类型,需要解码为字符串
        #         print(f'收到{addr}信息: {info}')
        #         # dataSocket.send(f'服务端接收到了信息 {info}'.encode())
        #     dataSocket.close()

        def welcome():
            while True:  # 在循环中,一直接受新的连接请求
                dataSocket, addr = listenSocket.accept()  # Establish connection with client.
                addr = str(addr)
                self.ui.listWidget_2.addItem(f'一个客户端 {addr} 连接成功')
                # 创建新线程处理和这个客户端的消息收发
                datafa = Thread(target=dataout, args=(dataSocket, addr))
                datafa.start()
                # datashou = Thread(target=datain, args=(dataSocket, addr)).start()

        listenSocket = socket(AF_INET, SOCK_STREAM)  # 实例化一个socket对象 用来监听客户端连接请求
        listenSocket.bind((IP, PORT))  # socket绑定地址和端口
        listenSocket.listen(8)
        self.ui.listWidget_2.addItem(f'服务端启动成功,在{PORT}端口等待客户端连接...')
        wel = Thread(target=welcome, args=())
        wel.start()

4、导出日志代码

    def logout(self):
        count = self.ui.listWidget_2.count()# 获取listwidget中条目数
        f=open('server.txt','w',encoding='utf8')
        for i in range(count):  # 遍历listwidget中的内容
            f.write(self.ui.listWidget_2.item(i).text()+'\n')
        f.close

你可能感兴趣的:(pyside2入门,python)