首页 > 其他 > 详细

socket套接字通信和粘包问题

时间:2019-12-05 20:48:28      阅读:54      评论:0      收藏:0      [点我收藏+]

socket套接字通信:

什么是socket?

socket是一个模块,又称套接字,用来封装互联网协议(应用层以下的层)。

为什么要有socket?

socket可以实现 互联网协议 应用层以下的层的工作

-提高开发效率

怎么使用socket?

import socket

写socket套接字:

Client

Server

技术分享图片

server.py
#服务端
import socket
#获取手机
server = socket.socket()
#绑定ip地址,port端口
server.bind((127.0.0.1,8500))
#半连接池
server.listen(5)#最多5个人坐椅子,实际上==6
print(server is running)
while True:
#conn为通道 ,等待电话的接入
    conn,addr = server.accept()
    print(addr)
    while True:
        try:
            #接听对方假话的内容
            #data客户端发送过来的消息
            date = conn.recv(1024)
            print(date.decode(utf-8))
            if len(date) == 0:
                break
            if date.decode(utf-8) == q:
                break
            send_date = input("服务端>>:")
            #服务端往客户端发送消息
            conn.send(send_date.encode(utf-8))
        except Exception as e:
            print(e)
            break
client.py
#客户端
import socket
#买手机
client = socket.socket()
#拨号 connect为连接
client.connect((127.0.0.1,8500))#客户端的ip与port必须与服务端一致
print(client is running)
while True:
    send_date = input("客户端>>:")
    #必须发送bytes类型的数据
    client.send(send_date.encode(utf-8))
    #接受date的数据
    date = client.recv(1024)
    if date.decode(utf-8) == q:
        break
    if len(date) == 0:
        break
    print(date.decode(utf-8))
client.close()

粘包

  1)问题:无法确认对方发送过来数据的大小。

  2)问题:在发送数据间隔短并且数据量小的情况下,

  会将所有数据一次性发送

  确认:确认对方数据的大小

解决粘包问题(struct模块

  -无论哪一端先发送数据

    -客户端

    1)先制作报头,并发送(struct)

    2)发送真实数据

  -服务端:

    1)接受报头,并解包获取 真实数据长度

    2)根据真实数据长度 接受真实数据

    recv(真实数据长度)

 

 

socket套接字通信和粘包问题

原文:https://www.cnblogs.com/lvguchujiu/p/11991677.html

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