socket_tcp_客户端

227 阅读1分钟

客户端流程

image.png

image.png

sockfd.connect(server addr)

  • 功能:连接服务器
  • 参数:元组服务器地址

为了防止两端都阻塞,recv send要配合使用


import socket
from socket import *
# 创建tcp套接字
sockfd =socket(AF_INET, SOCK_STREAM)

# 客户端一般不绑定端口  由操作系统自动分配端口

server_addr=('192.168.199.201',6542)
 
sockfd.connect(server_addr)
while True:
    #over_data = sockfd.recv(1024)
    #print("收到了 ", over_data.decode())

    data=input("发送:")
    if not data:
        break
    sockfd.send(data.encode())
    aa=sockfd.recv(1024)
    print("送到",aa.decode())
    # if not data:
    #     break
sockfd.close() # 若客户端close后,recv会立即返回一个空


# 因为还有数据在读缓存里,客户端的应用程序没有读取。此时,如果close的话,客户端TCP 会发送RST给对端。

send 当缓冲区没有内容的时候,程序堵塞 缓冲区可以协调收发速度

收发缓冲区

image.png

tcp粘包(UDP不会出现粘包)

发送比接受的速度快,发送和接受的速率不协调。

  • 原因:tcp以字节流方式传输,没有消息边界。多次发送的消息被一次接收,此时就会形成粘包。
  • 影响:如果每次发送内容是一个独立的含义,需要接收端独立解析此时粘包会有影响。

解决方法:

  • 1.人为的添加消息边界,再进行二次处理
  • 2.控制发送速度