socket套接字通信和粘包问题

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(真实数据长度)

 

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