Twenty-four tcp协议

 

osi七层协议的传输层:TCP/UDP协议

1、TCP协议:语音通话(发送文件、下载上传)

    必须线接通电话,同一时刻只能和一个人聊天,传输稳定,慢

    可以发送任意长度的信息

  UDP协议:发微信(即使通信、在线播放)

    不需要接通,只要互相知道ip 端口就可以通信,同时可以和多个人聊天,快

    但是传输相对不稳定,不能传输过长的消息

2、TCP协议socket

# server服务端
import socket
while True:
    sk = socket.socket()
    sk.bind(('192.168.13.16', 9000))  # 把地址绑定到socket
    sk.listen(3)          # 监听链接
    while True:    # 循环不断开发送信息
        conn, addr = sk.accept()  # 接受客户端链接
        ret = conn.recv(1024).decode()  # 解码接收客户端信息
        print(ret)       # 打印客户端信息
        ret1 = input('>>>')
        conn.send(ret1.encode())        # 编码并向客户端发送信息
        if ret == 'q':
            print('通话关闭')
            break
    conn.close()       # 关闭客户端socket
sk.close()        # 关闭服务器socket(可选)
# client 客户端
import socket
while True:    # 循环不断开发送
    sk = socket.socket()           # 创建客户socket
    sk.connect(('192.168.13.16', 9000))    # 尝试连接服务器
    ret1 = input('>>>')
    sk.send(ret1.encode())    # 编码
    ret = sk.recv(1024)         # 对话(发送/接收)
    ret = ret.decode()    # 解码
    print(ret)
    if ret == 'q':
        print('通话关闭')
        break
sk.close()            # 关闭客户socket

3、粘包现象:TCP是有来回的,为了提高效率而把极短时间内的东西(缓存区)放在一起发送,就会造成粘包效应,

  本质是接收端不知道发送端给我发送了多长的数据

  tcp协议本身的特点导致的:流式传输/无边界、合包机制、缓存机制、拆包机制

# 解决方法 自定义协议:先发送要传递数据的字节长度再发,接收先接4个字节知道长度
import struct
ret = struct.pack('i', 560000)  # 'i'固定范围,大小必须是多少内
print(ret, len(ret))    # b'\x80\x8b\x08\x00' 4
res = struct.unpack('i', ret)    
print(res[0])    # 560000

 

posted @ 2019-01-22 14:29  pythonernoob  阅读(140)  评论(0)    收藏  举报