zoukankan      html  css  js  c++  java
  • python__系统 : socket_TCP相关

    tcp和udp对比起来.还是tcp相对稳定一些,但是因为有三次挥手和四次握手,以及确认包(ack)的存在,可能在速度上会比udp慢.

    用python的socket模块可以建立tcp服务端:

    from socket import *
    import struct, time, os
    
    # 建立套接字, 绑定, 监听, 接收
    server_socket = socket(AF_INET, SOCK_STREAM)   # tcp 是 stream udp是 dgram
    server_socket.bind(('', 8899))
    server_socket.listen(5)
    new_socket, client_info = server_socket.accept()
    
    #新的套接字接收数据
    recv_data = new_socket.recv(1024)
    
    print('%s:%s' %(str(client_info), recv_data.decode('GBK')))
    
    new_socket.close()
    server_socket.close()

    其中 listen() 可以把建立的套接字变成被动监听的状态. accept() 这一步会导致堵塞,等待客户端发起连接请求(三次挥手)

    客户端发送请求连接完成之后,可以直接用 recv() 或者 send() 发送数据. 不需要用 recvfrom() 和 sendto() 因为已经建立连接了,在底层网络层(ip协议)会自动填上ip等信息的,应用层不需要填写.

    调用 close() 的时候,会进行四次挥手断开连接

    客户端demo:

    from socket import *
    
    # 建立socket, 连接, 发送, 接收
    tcp_client_socket = socket(AF_INET, SOCK_STREAM)
    tcp_client_socket.connect(('172.17.201.132', 9999))
    tcp_client_socket.send('你好啊'.encode('GBK'))
    recv_data = tcp_client_socket.recv(1024)
    
    print(recv_data.decode('GBK'))
    
    tcp_client_socket.close()

    一般客户端不需要绑定端口,因为是主动发送请求的.

    注意 :

    str.encode('GBK')  把Unicode 转码 成 GBK

    str.decode('GBK')  把 GBK 解码 成 Unicode      因为python3 内部全部用Unicode保存数据

    短连接:
    连接->传输数据->关闭连接
    HTTP是无状态的的短链接

    长连接:
    连接->传输数据->保持连接 -> 传输数据-> ...........->直到一方关闭连接,多是客户端关闭连接。
    长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差

  • 相关阅读:
    BZOJ 2212/BZOJ 3702
    BZOJ 4761 Cow Navigation
    BZOJ 3209 花神的数论题
    BZOJ 4760 Hoof, Paper, Scissors
    BZOJ 3620 似乎在梦中见过的样子
    BZOJ 3940 Censoring
    BZOJ 3942 Censoring
    BZOJ 3571 画框
    BZOJ 1937 最小生成树
    BZOJ 1058 报表统计
  • 原文地址:https://www.cnblogs.com/cccy0/p/9092974.html
Copyright © 2011-2022 走看看