zoukankan      html  css  js  c++  java
  • 网络协议TCP

    TCP:传输控制协议

    tcp的特点:面向连接(打电话模型),可靠传输

    tcp通信的三个步骤:

      1.通信双方建立连接

      2.收发收据

      3.关闭连接

    tcp客户端实现流程

    """TCP客户端实现流程
    1. 创建一个tcp 客户端对象
    2. 与服务端建立连接
    3. 通过tcp socket 收发数据
    4. 关闭连接
       关闭udp
    """
    import socket
    
    
    def main():
        #1. 创建一个tcp 客户端对象
        tcp_client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
        # 2. 与服务端建立连接
        # the address is a pair (host, port) # 元组 第一个元素是tcp服务端ip ,第二个元素是服务端的端口
        server_addr=('192.168.44.79',8080)
        tcp_client_socket.connect(server_addr)  #连接服务器connect
    
        # 3. 通过tcp socket 收发数据
        #3.1 发送数据到服务端
        send_data=input("请输入您要发送的数据:")
        tcp_client_socket.send(send_data.encode()) # 在linux中默认是utf-8编码
        
        # 3.2 等待接收从服务端回传的消息
        # (b'xc4xe3xd2xb2xbaxc3', None)
        # recv_data=tcp_client_socket.recvfrom(1024) # 每次最多接收1024字节
    
        # b'good'
        recv_data=tcp_client_socket.recv(1024) # 每次最多接收1024字节
    
        # 把字节串转为字符串   解码
        data=recv_data.decode('gbk')
    
        print("接收到的数据:",data)
    
        # 4. 关闭连接
        tcp_client_socket.close()
    
    
    if __name__ == '__main__':
        main() # alt+enter 快速修复

    tcp服务端流程

    """tcp服务端创建流程
    1. 创建服务端的tcp socket : server_socket 用于监听客户端的请求
    2. 绑定端口
    3. server_socket开启监听,由主动连接模式变为被动接受模式
    4. 等待接收客户端的请求, 一有连接,则立即响应,且创建一个与客户端对接的socket,用该socket与客户端通信
    5. 使用新创建的socket与客户端通信
    6. 关闭新创建的socket, 该socket关闭,则与当前客户端结束通信
    7. server_socket关闭,则不再接收新的客户端请求
    """
    import socket
    
    
    def main():
        #1. 创建服务端的tcp socket : server_socket 用于监听客户端的请求
        server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
        # 复用同一个端口而不会提示端口被占用 ,解决当关闭的socket当处于time_out状态时, 也可立即使用端口
        """
            socket.setsockopt(level,option,value) :配置socket
                level:等级,对哪个等级操作(ip,tcp,udp,socket等级)
                option:设置哪个选项
                        socket.SO_REUSEADDR: 复用地址
                value: True:表示复用,False,表示不复用
            """
        server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        # 提示:socket.setsockopt()方法要在 socket.bind()之前设置
    
        #2.绑定端口
        server_socket.bind(('',9999))
    
        #3. server_socket开启监听,由主动连接模式变为被动接受模式
        server_socket.listen(5)  # backlog 积压未办之事,好比排队队列,用于设置排队队列排队人数的最大值
    
        #4.等待接收客户端的请求, 一有连接,则立即响应,且创建一个与客户端对接的socket,用该socket与客户端通信
        # new_sock: 新创建的socket,用该socket与客户端通信
        # client_addr :客户端的地址
    
        # 为多个客户端提供服务
        while True:
            new_sock, client_addr=server_socket.accept()
            print("有新的客户端请求,来自-->",client_addr)
    
            # 5.使用新创建的socket与客户端通信
    
            # 为同一客户端提供多次服务
            while True:
                # 5.1 接收客户端的请求数据
                # 当客户端的socket调用了close后,则会向服务端发送0长度的信息,且服务端解阻塞
                recv_data=new_sock.recv(1024)
    
                if recv_data:
                    print("接收到的数据:",recv_data.decode('gbk'))
    
                    #5.2 回复数据给客户端
                    new_sock.send("欢迎光临".encode())
                else:
                    print("客户端已经下线...")
                    break
    
            # 6. 关闭新创建的socket, 该socket关闭,则与当前客户端结束通信
            new_sock.close()
    
        # 7.server_socket关闭,则不再接收新的客户端请求
        server_socket.close()
    
    
    if __name__ == '__main__':
        main()

    小结:TCP与UDP的不同点:

        1.面向连接

        2.有序数据传输

        3.重发丢失的数据包

        4.舍弃重复的数据包

        5.无差错的数据传输

        6.阻塞/流量控制

    TCP的三次握手与四次挥手

     

  • 相关阅读:
    书签
    身份证查询
    Swiper 中文API手册(share)
    seo查询命令
    前端开发薪资之各地区对比(图文分析)(share)
    新浪微博AppKey大集合(share)
    PHP乱码问题,UTF-8(乱码) (share)
    JavaScript 获取数组中最大值、最小值
    设为首页 添加到收藏夹 (share)
    javascript数组 去重
  • 原文地址:https://www.cnblogs.com/xiaolu915/p/10511024.html
Copyright © 2011-2022 走看看