首页 > 编程语言 > 详细

Python socket 粘包问题 报头

时间:2019-08-07 21:02:35      阅读:101      评论:0      收藏:0      [点我收藏+]

一 socket(套接字)

1.什么是socket:Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。它把复杂的TCP/IP协议族隐藏在Socket接口后面,了socket以后,无需自己编写代码实现三次握手,四次挥手,ARP请求,打包数据等等,socket已经封装好了,只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。

技术分享图片

2.基本语法

技术分享图片
客户端
import socket
# 1.创建socket对象  
client = socket.socket() 
# 2.链接服务器    
client.connect((ip,port)) 
# 3.收发数据   通常需要循环
client.send(二进制数据) #   只能发二进制数据
client.recv(字节数)    #  收多少字节数 阻塞直到接收到数据
# 4.断开链接   
client.close()

服务端
# 1.创建socket对象
server = socket.socket()
# 2.绑定一个固定的ip和端口
server.bind(ip,port))
# 3.开始监听客户端的到来
server.listen() # 可不填
# 4.接收客户端的链接请求
conn,addr = server.accept()  # 阻塞直到客户链接到来  没有新连接则不可能执行该函数
# 5.收发数据   通常需要循环
conn.send(二进制数据) #   只能发二进制数据
conn.recv(字节数)    #  收多少字节数 阻塞直到接收到数据
# 6.关闭双行通道和服务器
conn.close()
server.close()
复制代码
View Code
技术分享图片
服务端套接字函数
s.bind()    绑定(主机,端口号)到套接字
s.listen()  开始TCP监听
s.accept()  被动接受TCP客户的连接,(阻塞式)等待连接的到来

客户端套接字函数
s.connect()     主动初始化TCP服务器连接
s.connect_ex()  connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

公共用途的套接字函数
s.recv()            接收TCP数据
s.send()            发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall()         发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom()        接收UDP数据
s.sendto()          发送UDP数据
s.getpeername()     连接到当前套接字的远端的地址
s.getsockname()     当前套接字的地址
s.getsockopt()      返回指定套接字的参数
s.setsockopt()      设置指定套接字的参数
s.close()           关闭套接字

面向锁的套接字方法
s.setblocking()     设置套接字的阻塞与非阻塞模式
s.settimeout()      设置阻塞套接字操作的超时时间
s.gettimeout()      得到阻塞套接字操作的超时时间
View Code

3.循环连接和循环通信

技术分享图片
客户端
import socket

client = socket.socket()
client.connect((127.0.0.1,8080))

while True:
    msg = input(>>>:).encode(utf-8)
    if len(msg) == 0:continue
    client.send(msg)
    data = client.recv(1024)
    print(data)

服务端
import socket

"""
服务端
    固定的ip和port
    24小时不间断提供服务
"""
server = socket.socket()  # 生成一个对象
server.bind((127.0.0.1,8080))  # 绑定ip和port
server.listen(5)  # 半连接池

while True:
    conn, addr = server.accept()  # 等到别人来  conn就类似于是双向通道
    print(addr)  # (‘127.0.0.1‘, 51323) 客户端的地址
    while True:
        try:
            data = conn.recv(1024)
            print(data)  # b‘‘  针对mac与linux 客户端异常退出之后 服务端不会报错 只会一直收b‘‘
            if len(data) == 0:break
            conn.send(data.upper())
        except ConnectionResetError as e:
            print(e)
            break
    conn.close()
View Code

 

Python socket 粘包问题 报头

原文:https://www.cnblogs.com/tfzz/p/11317612.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!