Python从入门到精通-------------tcp协议

tcp协议的知识点

scoket()  tcp协议的server
bind 绑定一个ip和窗口
listen 监听,代表socket服务的开启
accept 等,到有客户来访问和客户端建立连接
send 只通过连接发送消息,不需要访问地址
recv 只接受消息
connect 客户端/toc协议的方法,和server端建立连接
close 关闭服务/连接

1.简单的tcp协议的演示

sever端

import socket

sk = socket.socket()
sk.bind(('10.61.0.52', 9001))  # 申请操作系统的资源
sk.listen()  #

conn, addr = sk.accept()  # conn里储存的是一个客户端和server端的连接信息
conn.send(b'hellow')
msg = conn.recv(1024)
print(msg)
conn.close()  # 挥手 断开连接
sk.close()  # 归还申请操作系统的资源

client端

import socket

sk = socket.socket()  #
sk.connect(('10.61.0.52', 9001))

msg = sk.recv(1024)  #
print(msg)  #
sk.send(b'baibai')  #

sk.close()

2.实现多个客户间的通信,(可以通信中文,可以输入想说的内容,可以自动的断开通信)

 

sever端

import socket
sk = socket.socket()
sk.bind(('10.61.0.207', 9002))  # 申请操作系统的资源
sk.listen()
while True: # 同时连接上多个用户的功能
    conn, addr = sk.accept()
    print('conn:',conn)  # 获得地址
    while True:  # 可以进行多次对话的功能
        word = input('输入内容\n>>>')
        conn.send(word.encode('utf-8'))
        msg = conn.recv(1024).decode('utf-8')
        if msg.upper() == '退出': break
        print(msg)
    conn.close()

sk.close()

client端

import socket
sk = socket.socket()  #
sk.connect(('10.61.0.207', 9002))
while True: # 添加多次会话功能
    msg = sk.recv(1024)
    msg2 = msg.decode('utf-8') # 我们在这里改变了编码方式
    if msg2.upper() == '退出': break
    print(msg2)  #
    word = input('请输入内容\n>>>')
    sk.send(word.encode('utf-8'))# 在在里我改变了发送回
                                      # 去的编码方式

sk.close()

 

tcp协议的粘包现象

什么是粘包?
    两条或更多分开发送的信息连接在一起的就是粘包现象
发生在发送端的粘包:发送间隔短,数据小,由于优化机制就合并在一起发送了
发送在接收端的粘包:tco协议的传输是流式传输,数据与数据之间没有边界
粘包发送的本质:tco协议的传输是流失传输,数据与数据之间没有边界

解决粘包现象的方法:自定义协议 struct模块

         发送端                           接收端                    
         先发送4字节的数据长度   先接收4字节,知道数据的长度
         先按照长度发送数据      在按照长度接收数据

sever端

# 在使用tcp协议时如何避免粘包现象
    # 只要控制第一个字节的长度后就可以避免粘包现象了
# 使用struck模块将字节转换成4个字节的
import struct   # 使用了struck模块
sk = socket.socket()
sk.bind(('10.61.0.87',9001))
sk.listen()

conn,addr = sk.accept()
msg1 = input('输入内容>>>') .encode()
msg2 = input('输入内容>>>').encode()
blen = struct.pack('i',len(msg1))  # 控制第一个字节的长度,长度为4
conn.send(blen)
conn.send(msg1)
conn.send(msg2)
conn.close()
sk.close()

client端

# 粘包现象的解决
# 使用struct模块
import socket
import struct
sk = socket.socket()
sk.connect(('10.61.0.87',9001))
len_msg1 = sk.recv(4)
len_msg1 = struct.unpack('i',len_msg1)[0]
msg1 = sk.recv(len_msg1)
msg2 = sk.recv(1024)
print(msg1.decode('utf-8'))
print(msg2.decode('utf-8'))
sk.close()

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值