Python3.6:socket实现简单传输数据

作者: james_chang | 来源:发表于2018-02-09 17:04 被阅读14次

    客户端:

    import socket
    
    flag = True
    
    # 生成socket对象
    client = socket.socket()
    
    # 链接要链接的ip和port(端口)
    client.connect(('localhost', 6666))
    
    # while循环
    while flag:
    
        # 获得用户输入
        msg = input("Enter your message('q' for quit):").strip()
    
        # 判断是否为空
        if len(msg) == 0:
            print("Message can't be empty")
            continue
    
        # 发送数据
        client.send(msg.encode())
    
        # 判断是否为'q'
        if msg != 'q':
    
            # 接收数据
            data = client.recv(1024)
    
            # 打印接收到的数据
            print(data)
    
        else:
            # 条件为False
            flag = False
    
    # 关闭socket链接
    client.close()
    print('Server Closed')
    

    服务器端:

    import socket
    
    flag = True
    
    # 生成socket对象
    server = socket.socket()
    
    # 绑定ip和端口
    server.bind(('localhost', 6666))
    
    # 监听绑定的端口
    server.listen()
    
    # 方便识别打印一个我在等待
    print("I'm waiting the connect...")
    
    
    # 这里用两个值接受,因为链接上之后使用的是客户端发来请求的这个实例
    # 所以下面的传输要使用conn实例操作
    conn, addr = server.accept()
    
    # 打印链接成功
    print('Connect success!')
    
    # 进入循环
    while flag:
    
        # 接受数据并赋给data
        data = conn.recv(1024).decode()
    
        # 判断
        if data != 'q':
    
            # 打印收到数据
            print('收到:', data)
    
            # 发送我收到数据了
            conn.send('Send Successed!'.encode())
    
        else:
    
            # 条件为False
            flag = False
    
    # 关闭socket链接
    server.close()
    

    先运行服务器端,后运行客户端:



    需要注意的几个点:

    编码问题,因为只支持bytes类型数据,每次发送之前要encode()一下,接收之后要decode()一下

    服务器端的while判断要放在accept()之后,也就是说不能将accept()放在循环中,如果包进循环中,只能传输一次就会卡住,第二次循环就会再等待连接

    不能send空,如果为空的话服务器端recv会一直等待,也就是说客户端什么都不输入直接回车就会卡住,可以通过判断避免这种情况

    这里呢是客户端断开服务器端也会断开,这里是我自己写的断开,即使不写,客户端断开服务器端也会断开,可以在accept上再添加一个循环,修改一下服务器端就可以了

    import socket
    
    flag = True
    
    # 生成socket对象
    server = socket.socket()
    
    # 绑定ip和端口
    server.bind(('localhost', 6666))
    
    # 监听绑定的端口
    server.listen()
    
    while flag:
    
        # 方便识别打印一个我在等待
        print("I'm waiting the connect...")
    
        # 这里用两个值接受,因为链接上之后使用的是客户端发来请求的这个实例
        # 所以下面的传输要使用conn实例操作
        conn, addr = server.accept()
    
        # 打印链接成功
        print('Connect success!')
    
        # 进入循环
        while flag:
    
            # 接受数据并赋给data
            data = conn.recv(1024).decode()
    
            # 判断
            if data != 'q':
    
                # 打印收到数据
                print('收到:', data)
    
                # 发送我收到数据了
                conn.send('Send Successed!'.encode())
    
            else:
                print('This connection is broken')
                break
    
    # 关闭socket链接
    server.close()
    

    这样就实现了客户端断开服务器端不会断开,服务器一直等待客户端连接

    转载请注明出处

    python自学技术互助扣扣群:670402334

    下一篇:socket实现简单ssh客户端

    相关文章

      网友评论

        本文标题:Python3.6:socket实现简单传输数据

        本文链接:https://www.haomeiwen.com/subject/agwftftx.html