python socket多线程实现客户端与服务器连接

 更新时间:2021年09月05日 16:41:39   作者:上不了山的小非洲  
这篇文章主要为大家详细介绍了python socket多线程实现客户端与服务器连接,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

python socket多线程实现客户端与服务器连接,供大家参考,具体内容如下

之前因为一些作业需要完成一个服务器监听多个客户端的程序,于是就用python写了这样的程序。话不多说,直接上代码。

server代码:

import json
import socket
import threading
import time
import struct

class Server():
    def __init__(self):
        self.g_conn_pool = {}  # 连接池
        # 记录客户端数量
        self.num =0
        # 服务器本地地址
        self.address = ('0.0.0.0', 8000)
        # 初始化服务器
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.server_socket.bind(self.address)
        self.server_socket.listen(128)
    def accept_client(self):
        """
            接收新连接
            """
        while True:
            client_socket, info = self.server_socket.accept()  # 阻塞,等待客户端连接
            print(client_socket,port)
            # 给每个客户端创建一个独立的线程进行管理
            thread = threading.Thread(target=self.recv_msg, args=(client_socket,info))
            thread.setDaemon(True)
            thread.start()
    def recv_msg(self,client,info):
        # 提示服务器开启成功
        print('服务器已准备就绪!')
        client.sendall("connect server successfully!".encode(encoding='utf8'))
        # 持续接受客户端连接
        while True:
            try:
                client.sendall(b'Success')
                while True:
                    msg = client.recv(1024)
                    msg_recv = msg.decode('utf-8')
                    if not msg_recv:
                        continue
                    else:
                        recv_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                        print('客户端 ' + recv_time + ':\n')
                        print(' ' + msg_recv + '\n')
            except Exception as e:

                print('客户端断开连接...')
                exit(-1)
                break
    def start_new_thread(self):
        """启动新线程来接收信息"""
        thread = threading.Thread(target=self.accept_client, args=())
        thread.setDaemon(True)
        thread.start()

server服务器类,主要是监听以及接收客户端的信息。

#实例化一个Flask节点
app = Flask(__name__)


@app.route('/')
def hello():
    return 'hello'


if __name__ == '__main__':
 #创建解析器
    from argparse import ArgumentParser
    parser = ArgumentParser()
    parser.add_argument('-p', '--port', default=5030, type=int, help='port to listen on')
    args = parser.parse_args()
    #获取端口号
    port = args.port
    #实例化一个server类 并启动
    py_server = Server()
    py_server.start_new_thread()
    #启动Flask节点
    app.run(host='127.0.0.1',port=port)

Client代码

class Client():

    def __init__(self):
     #服务器ip与端口
        self.server_address = ('127.0.0.1', 8000)
        
        self.num = 0
    def recv_msg(self):
        print("正在连接服务器....")

        # 客户端连接服务器
        while True:
            try:
                self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                #连接服务器
                self.client_socket.connect(self.server_address)

                num = self.num

                # 制作报头
                header_dic = {
                    'filename': num
                }
                header_bytes = json.dumps(header_dic).encode('utf-8')
                self.client_socket.send(struct.pack('i', len(header_bytes)))
                self.client_socket.send(header_bytes)
                
    #接收信息
                while True:
                    msg_recv = self.client_socket.recv(1024).decode('gbk')
                    print(msg_recv)

                    if msg_recv == 'Success':
                        print('客户端已与服务器成功建立连接...')
                    elif not msg_recv:
                        continue
                    else:
                        recv_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                        print( '服务器 ' + recv_time + ':\n')
                        print(' ' + msg_recv + '\n')

            except:
                print('与服务器断开连接...')
                break
    def start_new_thread(self):
        """启动新线程来接收信息"""
        thread = threading.Thread(target=self.recv_msg, args=())
        thread.setDaemon(True)
        thread.start()
        
def main():
    wf = Client()
    wf.start_new_thread()
 while True:
        a = input()
        wf.client_socket.send(a.encode('utf-8'))

if __name__ == '__main__':

    main()

以上为客户端程序的代码。

下面是运行的结果:

服务器端:

多个客户端:

代码实现还是蛮容易的,具体可以自行修改使用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 基于Python实现人脸识别相似度对比功能

    基于Python实现人脸识别相似度对比功能

    人脸识别技术是一种通过计算机对人脸图像进行分析和处理,从而实现自动识别和辨认人脸的技术,随着计算机视觉和模式识别领域的快速发展,人脸识别技术取得了长足的进步,本文给大家介绍了基于Python实现人脸识别相似度对比功能,感兴趣的朋友可以参考下
    2024-01-01
  • 为Python程序添加图形化界面的教程

    为Python程序添加图形化界面的教程

    这篇文章主要介绍了为Python程序添加图形化界面的教程,图形化界面编程是开发Python本地应用的必备,需要的朋友可以参考下
    2015-04-04
  • python通过yield实现数组全排列的方法

    python通过yield实现数组全排列的方法

    这篇文章主要介绍了python通过yield实现数组全排列的方法,实例分析了全排列的概念及yield实现的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • 解析python 类方法、对象方法、静态方法

    解析python 类方法、对象方法、静态方法

    这篇文章主要介绍了解析python 类方法、对象方法、静态方法的的相关资料,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-08-08
  • Flask-蓝图 blueprint详情

    Flask-蓝图 blueprint详情

    这篇文章主要介绍了 Flask-蓝图 blueprint的相关资料,Blueprint 是一个存储视图方法的容器,这些操作在这个Blueprint 被注册到一个应用之后就可以被调用,Flask 可以通过Blueprint来组织URL以及处理请求,更多相关资料需要的小伙伴可以参考下面文章
    2021-11-11
  • 基于python实现图书管理系统

    基于python实现图书管理系统

    这篇文章主要为大家详细介绍了基于python实现图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Python实战之利用Geopandas算出每个省面积

    Python实战之利用Geopandas算出每个省面积

    GeoPandas是一个基于pandas,针对地理数据做了特别支持的第三方模块。本文将利用GeoPandas计算出每个省的面积,感兴趣的小伙伴快跟随小编一起学习一下吧
    2021-12-12
  • 详解pygame捕获键盘事件的两种方式

    详解pygame捕获键盘事件的两种方式

    这篇文章主要介绍了详解pygame捕获键盘事件的两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • wxPython事件驱动实例详解

    wxPython事件驱动实例详解

    这篇文章主要介绍了wxPython事件驱动机制,以一个获取当前位置信息的实例形式讲述了wxPython事件驱动机制及其相关函数的用法,非常具有实用价值,需要的朋友可以参考下
    2014-09-09
  • python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例

    python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例

    这篇文章主要介绍了python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例,需要的朋友可以参考下
    2020-02-02

最新评论