zoukankan      html  css  js  c++  java
  • TCP服务端实现并发

    socket 在 tcp 协议下通信

    客户端
    import socket
    ​
    # 创建客户端TCP协议通信
    c = socket.socket()
    # 与指定服务端握手
    c.connect(('127.0.0.1', 8080))
    ​
    # 通信循环
    while True:
        # 向服务端发送信息
        msg = input('>>>')
        if len(msg) == 0:continue
        c.send(msg.encode('utf-8'))
        # 接受服务端信息
        data = c.recv(1024)
        print(data.decode('utf-8'))

     

    普通服务端
    import socket
    ​
    # 创建服务端TCP通信
    s = socket.socket()
    # 绑定ip+port
    s.bind(('127.0.0.1', 8080))
    s.listen(5)
    ​
    # 连接循环
    while True:
        # 接收用户端管道和地址
        conn, addr = s.accept()
        print(addr)
        # 通信循环
        while True:
            # 客户端若异常退出会报错,try一下
            try:
                # 接收客户端发送的信息
                data = conn.recv(1024)
                if len(data) == 0:break
                # 在服务端打印出来
                print(data.decode('utf-8'))
                # 转大写发给服务端
                conn.send(data.upper())
            except ConnectionResetError:
                break
        # 客户端退出 服务端则关闭连接通道
        conn.close()
    此时服务端每次只能服务一个用户,因为建立连接与接受信息是同一个人在干活,要想建立另外一个连接需要先断开正在连接的这个用户
    所以实现socket并发的思路是: 让建立连接与接受信息分开干活
    并发服务端(线程下的实现方法)
    import socket
    from threading import Thread
    ​
    # 创建TCP协议socket通信对象
    s = socket.socket()
    s.bind(('127.0.0.1', 8080))
    s.listen(5)
    ​
    # 创建循环通信的子线程
    def communication(conn, addr):
        while True:
            try:
                data = conn.recv(1024)
                print(data.decode('utf-8'))
                msg = input('>>>:')
                if len(msg) == 0:continue
                conn.send(msg.encode('utf-8'))
            except ConnectionResetError as e:
                print(e,addr)
                break
        conn.close()
    ​
    ​
    # 创建连接循环
    while True:
        conn, addr = s.accept()
        # print(conn)
        print(addr)
        # 创建子线程,
        t = Thread(target=communication, args=(conn,addr))
        t.start()
     

     

  • 相关阅读:
    3. 尾缀
    Cocos工程命名规则整理(node部分)
    3.1-3.3 HBase Shell创建表
    2.11-2.12 HBase的数据迁移常见方式
    2.8-2.10 HBase集成MapReduce
    2.7 HBase架构深入剖析
    2.3-2.6 HBase java API
    2.1-2.2 HBase数据存储
    1.6-1.8 HBase表的物理模型
    1.4-1.5 HBase部署及基本使用
  • 原文地址:https://www.cnblogs.com/waller/p/11352073.html
Copyright © 2011-2022 走看看