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()
     

     

  • 相关阅读:
    Visual Studio使用阿里云Code Git服务器的常见问题
    使用Quartz.net来执行定时任务
    DirectorySearcher.Filter 属性(转)
    angular2的ElementRef在组件中获取不到
    angular2 ngfor循环
    angular2 日期格式化
    angular2在模板中使用属性引发Cannot read property 'xxx' of undefined
    Java ConcurrentHashMap存入引用对象时也是线程安全的
    FtpHelper实现ftp服务器文件读写操作(C#)
    Window服务项目脚手架
  • 原文地址:https://www.cnblogs.com/waller/p/11352073.html
Copyright © 2011-2022 走看看