socket编程中,服务器如何检测到客户端网络连接的断开.比如说客户端的网线断掉了,从服务端如何能检测到呢l

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket编程中,服务器如何检测到客户端网络连接的断开.比如说客户端的网线断掉了,从服务端如何能检测到呢l相关的知识,希望对你有一定的参考价值。

我是在linux下开发的,请熟悉socket编程的人帮忙解答下,最好能提供经过验证的方法,多谢。

通过心跳包来确保客户端是否正常连接,比如定时发心跳包给客户端,然后接收回应包,如果没有收到该回应包则可以认为客户端已经断开连接,这个算是常规做法,至少在我所有SOCKET编程中都使用这种方式来维护连接状态。 参考技术A 除了楼上说的心跳包之外,可以查看read函数的返回值来进行判断

11.网络编程:socket服务端客户端

socket:

  • socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
  • python中使用socket来进行网络连接传输
  •  

    技术分享图片

    由图可知:

    socket中客户端需要进行的操作是:建立,连接,传输数据 ,接收数据,关闭连接

    服务端需要进行的操作是:建立,绑定IP地址和端口,等待连接,接收数据,传输数据 ,关闭连接

     


    服务端:

    • 建立:socket.socket()
    • 绑定端口:bind((‘IP地址‘,端口)),其中地址和端口号是一个 tuple
    • 监听:listen()
    • 接受连接:accept(),返回值是一个连接实例和一个地址,地址是连接过来的客户端地址,而数据操作要利用这个连接实例
    • 传输数据:send(),传输的数据必须是字节流,所以对字符串数据需要使用encode()
    • 接收数据read:recv(x),传输的数据必须是字节流,x是接收的字节数,如果需要转成Unicode,需要使用decode()
    • 关闭连接close:close()

     

    import socket
    server=socket.socket()#建立socket
    
    server.bind((localhost,1234))#绑定
    server.listen()#监听
    print("开始等待。。。")
    conn,addr=server.accept()#接收连接
    print("连接成功")
    data=conn.recv(1024)#接收数据
    print(data.decode())
    conn.send(data)#发送数据
    
    server.close()#关闭连接
    
    
    print("--------------------")

     

    • 上述代码存在一个问题:只能接受一次连接,连接结束后,服务端socket将关闭,更改成不立即关闭能等待下一个连接的:
    #服务器端
    
    import socket
    server = socket.socket()
    server.bind((localhost,1234)) #绑定ip和端口
    server.listen(5) #监听
    
    print("开始等待")
    while True:
        conn, addr = server.accept()
        print(conn, addr)
        print("客户端连接")
        while True:
            data = conn.recv(1024)
            print("recv:",data)
            if not data:
                print("连接断开...")
                break
            conn.send(data)
    
    server.close()

     

     

     


    客户端:

    • 建立:socket.socket()
    • 连接:connect((‘IP地址‘,端口)),其中地址和端口号是一个 tuple
    • 传输数据:send(),传输的数据必须是字节流,所以对字符串数据需要使用encode()
    • 接收数据recv:recv(),传输的数据是字节流,如果需要转成Unicode,需要使用decode()
    • 关闭连接close:close()
    import socket
    client=socket.socket()#建立socket
    client.connect((localhost,1234))#连接
    client.send("你好".encode())#发送数据
    data=client.recv(1024)#接收数据
    print(data.decode())
    
    client.close()#关闭连接
    • 上述代码存在一个问题:只能发送一次数据,发生完数据就会断开连接,改成可以多次发送数据,不自动断开的【前提是服务端能接收多次】:
    import socket
    
    client=socket.socket()
    
    client.connect((localhost,1234))
    while True:
        cmd=input(">>")
        if len(cmd)==0:
            continue
        client.send(cmd.encode())
        cmd_res=client.recv(1024)
        print(cmd_res.decode())
    
    client.close()

    以上是关于socket编程中,服务器如何检测到客户端网络连接的断开.比如说客户端的网线断掉了,从服务端如何能检测到呢l的主要内容,如果未能解决你的问题,请参考以下文章

    如何判断socket客户端连接断开

    软件工程 2016.6.30 日报

    Socket服务器端如何检测客户端的连接状态?

    11.网络编程:socket服务端客户端

    如何检测套接字连接何时丢失?

    网络编程socket-SocketServer