zoukankan      html  css  js  c++  java
  • 网络编程-socket实现连接循环

    解决报端口被使用错误

    phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR)

     bug 1:客户端敲回车被卡主,客户端被卡在recv等待接收数据

    import socket
    client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    client.connect(('127.0.0.1',8080))
    #通信循环
    while True:
        msg=input('>> ').strip()
        if not msg:continue#避免用户输入空字符串导致客户端卡死
        client.send(msg.encode('utf-8'))
        data=client.recv(1024).decode('utf-8')
        print(data)
    #关闭连接
    client.close()
    View Code

    bug 2:客户端单方面断开后,linux平台上服务端会出现死循环接收数据,导致服务器卡死。window平台会直接报错。

    Linux服务端

    import socket
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #解决提示端口被使用问题
    phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    phone.bind(('127.0.0.1',8080))
    phone.listen(5)
    conn,client_addr=phone.accept()
    print(client_addr)
    #通信循环
    while True:
        data=conn.recv(1024)
        if not data:break#客户端单方面死掉,服务端会收到空字符串
        conn.send(data.upper())
    conn.close()
    phone.close()
    View Code

    Windows服务端

    import socket
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #解决提示端口被使用问题
    phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    phone.bind(('127.0.0.1',8080))
    phone.listen(5)
    conn,client_addr=phone.accept()
    print(client_addr)
    #通信循环
    while True:
        try:
            data=conn.recv(1024)
            conn.send(data.upper())
        except ConnectionResetError:
            break
    conn.close()
    phone.close()
    View Code

    客户端

    import socket
    client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    client.connect(('127.0.0.1',8080))
    #通信循环
    while True:
        msg=input('>> ').strip()
        if not msg:continue#避免用户输入空字符串导致客户端卡死
        client.send(msg.encode('utf-8'))
        data=client.recv(1024).decode('utf-8')
        print(data)
    #关闭连接
    client.close()
    View Code

    实现server端循环连接:

    import socket
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #解决提示端口被使用问题
    phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    phone.bind(('127.0.0.1',8080))
    phone.listen(5)
    while True:#连接循环
        conn,client_addr=phone.accept()
        print(client_addr)
        while True:#通信循环
            try:
                data=conn.recv(1024)
                if not data: break  # 客户端单方面死掉,服务端会收到空字符串
                conn.send(data.upper())
            except ConnectionResetError:
                break
        conn.close()#连接关闭
    phone.close()#套接字关闭
    View Code
  • 相关阅读:
    Day-11 闭包和迭代器
    Day-01 Python基础
    Day-10 函数的进阶
    Day-09 初识函数
    Day-08 文件操作
    Day-07 基础数据类型补充 set集合 深浅拷贝
    Day-06 小数据池 再谈编码
    Day-05 基础数据类型字典dict
    Day-04 基础数据类型list, tuple
    NodeJs获取两个日期间的所有日期
  • 原文地址:https://www.cnblogs.com/yaya625202/p/8947570.html
Copyright © 2011-2022 走看看