您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

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

51自学网 2021-10-30 22:13:58
  python
这篇教程python socket多线程实现客户端与服务器连接写得很实用,希望能帮到您。

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

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

server代码:

import jsonimport socketimport threadingimport timeimport structclass 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()

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

下面是运行的结果:

服务器端:

多个客户端:

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

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


python简单实现图片文字分割
python使用opencv切割图片白边
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。