python之socket编程(TCP)

TCP协议

TCP协议介绍

  • 当应用程序希望通过TCP与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP将在两个应用程序之间建立一个全双工(full-duplex)的通信。
  • 这个全双工的通信将占用两个计算机之间的通信路线,直到它被一方或双方关闭为止。

Client与Server建立连接

  • 三次握手
    在这里插入图片描述

Client与Server数据传输

在这里插入图片描述

Client与Server断开连接

  • 四次挥手
    在这里插入图片描述

TCP协议特点

  • 面向连接
  • 可靠传输
    • TCP采用发送应答机制
    • 超时重传
    • 错误校验
    • 流量控制和阻塞管理

TCP通信

在这里插入图片描述

TCP客户端(client)的实现

在这里插入图片描述
步骤

  • 1、创建套接字
    	tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
  • 2、连接服务器
    	ip = input('请输入ip地址:')
        port = eval(input('请输入端口号:'))
        tcp_client.connect((ip, port))
    
  • 3、发送数据
    	data = input('请输入要发送的数据:')
        tcp_client.send(data.encode('gbk'))  # 将data转码gbk
    
    tip: windows默认编码gbk
  • 4、接收数据
    	recv_data = tcp_client.recv(1024)
        print(recv_data.decode('gbk'))  # 解码gbk
    
  • 5、关闭套接字
    	tcp_client.close()
    

完整代码

import socket


def main():
    # 1、创建套接字
    tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2、连接服务器
    ip = input('请输入ip地址:')
    port = eval(input('请输入端口号:'))
    tcp_client.connect((ip, port))
    # 3、发送数据
    data = input('请输入要发送的数据:')
    tcp_client.send(data.encode('gbk'))  # 将data转码gbk
    # 4、接收信息
    recv_data = tcp_client.recv(1024)
    print(recv_data.decode('gbk'))  # 解码gbk
    # 5、关闭套接字
    tcp_client.close()


if __name__ == '__main__':
    main()

TCP服务端(server)的实现

在这里插入图片描述
步骤

  • 1、创建套接字
    	tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
  • 2、绑定ip和port
    tcp_server.bind(('192.168.1.3', 8080))
    
  • 3、使套接字变为被动连接
    tcp_server.listen(2)
    
  • 4、等待连接
        print('等待连接中...')
        new_client, new_client_addr = tcp_server.accept()
        print(new_client_addr)
    
  • 5、发送数据
        data = input('请输入要发送给client的数据:')
        new_client.send(data.encode('gbk'))
    
  • 6、接收数据
        recv_data = new_client.recv(1024)
        print(recv_data.decode('gbk'))
    

完整代码

import socket


def main():
    # 1、创建套接字
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2、绑定ip和port
    tcp_server.bind(('192.168.1.3', 8080))
    # 3、使套接字变为被动连接
    tcp_server.listen(2)
    # 4、等待连接
    print('等待连接中...')
    new_client, new_client_addr = tcp_server.accept()
    print(new_client_addr)
    # 5、发送数据
    data = input('请输入要发送给client的数据:')
    new_client.send(data.encode('gbk'))
    # 6、接收数据
    recv_data = new_client.recv(1024)
    print(recv_data.decode('gbk'))


if __name__ == '__main__':
    main()
    

优化TCP服务端

  • 实现服务端为多个客户端服务
  • 实现与客户端多次交流

代码示例

import socket


def main():
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_server.bind(('192.168.1.3', 8080))
    while True:
        '''实现为多个客户端服务'''
        tcp_server.listen(108)
        print('等待连接中...')
        new_client, new_client_addr = tcp_server.accept()
        print(new_client_addr)
        while True:
            '''实现与客户端多次交流'''
            recv_data = new_client.recv(1024)
            # 当断开连接时,返回一个空字符串,聊天结束
            if recv_data.decode('gbk') == '':
                break
            print(recv_data.decode('gbk'))
            data = input('请输入要发送给client的数据:')
            new_client.send(data.encode('gbk'))
        # 关闭连接
        new_client.close()


if __name__ == '__main__':
    main()
    

文件下载器

在这里插入图片描述

  • 文件传输客户端
import socket


def client():
    # 1、创建套接字
    tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2、连接服务器
    tcp_client.connect(('192.168.1.3', 8080))
    # 3、发送文件名
    filename = input('请输入文件名:')
    tcp_client.send(filename.encode('gbk'))
    # 4、接收文件内容
    file_content = tcp_client.recv(1024 * 1024)
    # 5、保存新文件
    with open('附件' + filename, 'ab') as f:
        f.write(file_content)
    # 6、关闭套接字
    tcp_client.close()


if __name__ == '__main__':
    client()
  • 文件传输服务端
import socket


def get_content(filename):
    try:
        with open(filename + '.txt', 'rb') as f:
            content = f.read()
    except Exception as e:
        print(e)
        return
    return content


def server():
    # 1、创建套接字
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2、绑定
    tcp_server.bind(('192.168.1.3', 8080))
    # 3、设置队列
    tcp_server.listen(1)
    # 4、等待连接
    new_socket, new_addr = tcp_server.accept()
    # 5、接收文件名
    filename = new_socket.recv(1024).decode('gbk')
    # 6、发送文件内容
    content = get_content(filename)
    new_socket.send(content)
    # 7、关闭套接字
    new_socket.close()


if __name__ == '__main__':
    server()

最后,有喜欢博主写的内容的伙伴可以点赞收藏加关注哦!

扫描二维码关注公众号,回复: 11403672 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_44604586/article/details/107039760