Advertisement

socket编程---TCP发送与接收数据

阅读量:

TCP和UDP概述 TCP技术指南 TCP客户端技术解析 TCP服务端技术解析 使用建议文件传输工具示例

TCP协议介绍
若应用程序希望通过TCP与另一应用建立通信,则会发送一个请求信息。该请求必须被发送到指定地址。在双方建立连接后,TCP将在两个应用之间创建一个全双工通道(full-duplex)。
该全双工通道将占据两个计算机之间的传输介质直至一方或双方主动关闭为止。

三次握手
• 初版,四次握手

在这里插入图片描述

进化,三次握手

在这里插入图片描述

数据传输

在这里插入图片描述

四次挥手

在这里插入图片描述

TCP特点
• 面向连接
• 可靠传输
• TCP采用发送应答机制
• 超时重传
• 错误校验
• 流量控制和阻塞管理
UDP协议介绍
当应用程序希望通过UDP与一个应用程序通信时,传输数据之前源端和终端不建立连接。
当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。

TCP与UDP区别
• TCP采用连接方式;UDP则不建立连接进行数据传输。
• 在可靠性方面,TCP展现出显著优势:通过可靠服务确保数据传输无差错、不丢失、不重复且按序到达;而UDP仅能尽力保障交付质量,并不能做出可靠性承诺。
• UDP在实时性方面表现优异,在处理高速数据传输和实时通信需求上具有明显优势,并可支持一对一、一对多、多对一及多对多等多种通信模式。
• 从通信模式来看:相比而言,在系统资源需求上,TCP的要求更为显著;而UDP则因其较低的资源消耗而在实际应用中更具灵活性和效率。

UDP通信

在这里插入图片描述

TCP通信

在这里插入图片描述

TCP客户端构建流程
• 1.创建socket
• 2.链接服务器
• 3.接收数据
• 4.关闭套接字

复制代码
    import socket
    
    def main():
    tcp_client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
    
    server_ip = input("server_ip:")
    server_port = int(input("server_port:")) #与网络调试助手左侧一致
    tcp_client.connect((server_ip, server_port))
    
    send_data = input("发送的数据:")
    tcp_client.send(send_data.encode("gbk"))
    	
    	recv_data=tcp_client.recv(1024)
    print(recv_data.decode("gbk")) 
    
    tcp_client.close()
    
    if __name__ == '__main__':
    main()
    网络调试助手改为tcp server模式

TCP服务端
• 1. 建立一个新的socket
• 2. 将socket绑定到特定的IP地址和端口
• 3. 将套接字转换为监听状态
• 4. 接受客户端的连接请求
• 5. 实施收发数据操作

复制代码
    import socket
    
    def main():
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    tcp_server.bind(("192.168.20.216", 7890))#输入自己主机ip地址
    
    tcp_server.listen(128)
    
    new_client_socket, client_addr = tcp_server.accept()
    
    recv_data = new_client_socket.recv(1024)
    print(recv_data.decode("gbk"))
    
    send_data = input("请输入你要发送给client的信息:")
    new_client_socket.send(send_data.encode("gbk"))
    
    if __name__ == '__main__':
    main()
    
    网络调试助手改为tcp client模式

以上程序都是执行一问一答就断开连接了

需求:
• 实现TCP服务端为多个客户端服务
• 实现为客户端多次服务

复制代码
    """
    实现TCP服务端为多个客户端服务
    
    循环
    
    - 此程序需要注意的是:当一个客户端的服务结束之后就会自动断开,为等待的一个客户端服务
    - 只能服务一次,无法多次为一个客户端服务
    """
    import socket
    
    
    def main():
    tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    tcp_server.bind(("192.168.20.104", 7890))
    
    while True:
        tcp_server.listen(128)
    
        new_socket, client_addr = tcp_server.accept()
        print(client_addr)
    
        """
        1.允许多个客户端 连接
        2.允许为客户端多次服务的
        3.但是 当前 只允许 为一个客户端 进行多次服务 (多线程)
        """
        while True:
            recv_data = new_socket.recv(1024)
            print(recv_data)
    
            """
            解阻塞
            1.客户端发送过来数据 就会解阻塞
            2.自动断开连接   报错
            
            加以判断
            1.有数据 则回复消息
            2.无数据 主动关闭连接(new_socket) 跳出循环
            """
            if recv_data.decode("gbk"):
                send_data = "hello"
                new_socket.send(send_data.encode("gbk"))
            else:
                break  # 跳出循环
    
        # 关闭连接
        new_socket.close()
    
    tcp_server.close()
    
    
    if __name__ == '__main__':
    main()

全部评论 (0)

还没有任何评论哟~