tcp通信、socket、threading多线程、PyQt5界面

文章目录

  • 前言
  • 一、总讲
  • 二、socket
    • 1.设置服务端
    • 2.设置客户端
    • 3.难点
  • 总结


前言

由于课程的需要,笔者花费了近一个星期的时间终于学了一点关于tcp通信、socket、threading多线程、PyQt5界面的知识,菜鸟表示:“我终于升级了”


提示:博客中参考了几位博主的文章,随文附原网址

一、总讲

讲解的思路如下,其中的视频就没有了,取而代之的是其中之一的运行效果图
tcp通信、socket、threading多线程、PyQt5界面_第1张图片

tcp通信、socket、threading多线程、PyQt5界面_第2张图片

二、socket

1.设置服务端

提示:这下面的代码已经涉及到PyQt5界面设计了

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
import ui_test_1
from functools import partial
import socket
import threading

# 创建一个socket套接字,该套接字还没有建立连接
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定监听端口
server.bind(('localhost', 6688))
# 开始监听,并设置最大连接数
server.listen(5)
# 获取未建立连接的服务端的IP和端口信息
print(server.getsockname())
print(u'waiting for connect...')
# 等待连接,一旦有客户端连接后,返回一个建立了连接后的套接字和连接的客户端的IP和端口元组
connect, (host, port) = server.accept()
# 现在建立连接就可以获取这两个信息了,注意server和connect套接字的区别,
# 一个是未建立连接的套接字,一个是已经和客户端建立了连接的套接字
peer_name = connect.getpeername()
sock_name = connect.getsockname()
print(u'the client %s:%s has connected.' % (host, port))
print('The peer name is %s and sock name is %s' % (peer_name, sock_name))
connect.sendall('connected !'.encode('utf-8'))


# 发送数据给客户端
def server_send(ui):
    global connect
    input = ui.lineEdit.text()  # 收集第一个对话框中的信息
    print('server send:', input)
    connect.sendall(input.encode('utf-8'))  # 对要发送的数据进行编码格式转换


# 接受客户端的数据
def rec(connect):
    while 1:
        rec_data = connect.recv(1024).decode()  # 接收客户端信息并将其解码
        print('server receive:', rec_data)
        ui.lineEdit_2.setText(str(rec_data))  # 将客户端的信息输入到第二个对话框


if __name__ == '__main__':
    # 设置子线程,用于接收信息
    thread_rec = threading.Thread(target=rec, args=(connect,))
    thread_rec.start()
    app = QApplication(sys.argv)
    MainWindow = QMainWindow()
    ui = ui_test_1.Ui_MainWindow()
    ui.setupUi(MainWindow)
    # 设置窗口的标题为‘server’
    MainWindow.setWindowTitle('server')
    MainWindow.show()
    # 当检测到按钮被按下时,调动该函数
    ui.pushButton.clicked.connect(partial(server_send, ui))
    sys.exit(app.exec_())

2.设置客户端

代码如下:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
import ui_test_1
from functools import partial
import socket
import threading

# 创建一个socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 主动去连接本机IP和端口号为6688的进程,localhost等效于127.0.0.1,
# 也就是去连接本机端口为6688的进程
client.connect(('localhost', 6688))
print(client.recv(1024).decode())


# 判断输入是否为纯数字
def isNum(s):
    for i in s:
        if i.isdigit():
            continue
        else:
            return False
    return True


# 发送数据给服务端
def client_send(ui):
    global client
    input = ui.lineEdit.text()  # 收集第一个对话框中的信息
    print('client send:', input)
    client.sendall(input.encode('utf-8'))  # 对要发送的数据进行编码格式转换


# 接受服务端的数据
def rec(client):
    while 1:
        rec_data = client.recv(1024).decode()  # 接收服务端信息并将其解码
        print('client receive:', rec_data)
        if isNum(rec_data):
            # 如果服务端的信息为纯数字,则将其加1
            rec_data = int(rec_data) + 1
            ui.lineEdit_2.setText(str(rec_data))
        else:
            ui.lineEdit_2.setText(str(rec_data))  # 将服务端的信息输入到第二个对话框


if __name__ == '__main__':
    # 设置子线程,用于接收信息
    thread_rec = threading.Thread(target=rec, args=(client,))
    thread_rec.start()
    app = QApplication(sys.argv)
    MainWindow = QMainWindow()
    ui = ui_test_1.Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.setWindowTitle('client')  # 设置窗口的标题为‘client’
    MainWindow.show()
    # 当检测到按钮被按下时,调动该函数
    ui.pushButton.clicked.connect(partial(client_send, ui))
    sys.exit(app.exec_())

3.难点

本文中为了处理PyQt5界面更新跟终端保持接收数据的问题,使用了多线程,简介的来说,多线程好处就是同时并行执行同一个进程中的多个进程,另外还有个概念叫多进程,他们之间的关系如下:

线程和进程关系?
​进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运行。
​多线程可以共享全局变量,多进程不能。多线程中,所有子线程的进程号相同;
多进程中,不同的子进程进程号不同。
​进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.
线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),
但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行一个线程可以创建和撤销另一个线程;
同一个进程中的多个线程之间可以并发执行.

总结

其实上面的内容本质上是TCP通信,但我只是粗略的运用了python提供的包,并不是很了解底层是如何实现的(菜鸟的坦白),关于这个代码的延伸可以去学文件传输、聊天室

# 全部文件
# https://download.csdn.net/download/Flylion_truth/15725142
# 参考博文
# https://blog.csdn.net/youand_me/article/details/83088428?spm=1001.2014.3001.5501
# https://blog.csdn.net/AzureMouse/article/details/90338961?spm=1001.2014.3001.5506
# https://blog.csdn.net/daiyu__zz/article/details/81912018?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161533607216780266264981%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161533607216780266264981&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-81912018.first_rank_v2_pc_rank_v29&utm_term=python+%E5%A4%9A%E7%BA%BF%E7%A8%8B

由于笔者是个新手,欢迎各位大佬指出其中的错误

你可能感兴趣的:(Python,socket,python,pyqt5,多线程)