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中的Elasticsearch操作汇总

    python中的Elasticsearch操作汇总

    这篇文章主要介绍了python中的Elasticsearch操作汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 解决pandas .to_excel不覆盖已有sheet的问题

    解决pandas .to_excel不覆盖已有sheet的问题

    今天小编就为大家分享一篇解决pandas .to_excel不覆盖已有sheet的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • python判断给定的字符串是否是有效日期的方法

    python判断给定的字符串是否是有效日期的方法

    这篇文章主要介绍了python判断给定的字符串是否是有效日期的方法,涉及Python针对字符串与日期操作的相关技巧,需要的朋友可以参考下
    2015-05-05
  • django最快程序开发流程详解

    django最快程序开发流程详解

    这篇文章主要介绍了django最快程序开发流程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • pytorch加载语音类自定义数据集的方法教程

    pytorch加载语音类自定义数据集的方法教程

    这篇文章主要给大家介绍了关于pytorch加载语音类自定义数据集的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Python中异常重试的解决方案详解

    Python中异常重试的解决方案详解

    这篇文章主要给大家介绍了在Python中异常重试的解决方案,文中介绍的非常详细,相信对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面随着小编一起来看看吧。
    2017-05-05
  • Python检测一个对象是否为字符串类的方法

    Python检测一个对象是否为字符串类的方法

    这篇文章主要介绍了Python检测一个对象是否为字符串类的方法,即检测是一个对象是否是字符串对象,本文还讲解了一个有趣的判断方法,需要的朋友可以参考下
    2015-05-05
  • python使用ProjectQ生成量子算法指令集

    python使用ProjectQ生成量子算法指令集

    在量子计算机领域,由于实现方案的不同,在不同的体系内的指令集其实是不一样的,并不是说OpenQASM里面的所有指令都会被支持。但是这也没有关系,因为本文将要介绍的开源量子计算模拟器框架ProjectQ可以支持将输入的量子算法分解到对应的指令集中。
    2021-05-05
  • Python中的类学习笔记

    Python中的类学习笔记

    这篇文章主要介绍了Python中的类学习笔记,本文是个人学习总结,用实例讲解了类的定义、访问控制等内容,需要的朋友可以参考下
    2014-09-09
  • Python装饰器结合递归原理解析

    Python装饰器结合递归原理解析

    这篇文章主要介绍了Python装饰器结合递归原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07

最新评论