socket套接字,粘包问题

目录

scoket套接字

 socket工作流程

TCP服务端

TCP客户端

基于TCP 的SOCKET服务端与客户端

基础版本

客户端

加入连接循环

加入通信循环

支持并发的TCP服务端

常见问题:

半连接池

粘包问题

TCP协议的特点

解决粘包问题

UDP协议

服务端不需要考虑客户端是否异常退出



scoket套接字

基于文件类型的套接字家族名字:AF_UNIX

基于网络类型的套接字家族名字:AF_IN

socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的
例如我们每天浏览网页、QQ 聊天、收发 email 等等

1.socket介绍
1.什么是socket?
socket套接字,是进程通信的一种实现方式
2.主要特点
主要针对不同主机之间的通信。即网络进程的通信,
几乎所有的网络都是通et流程,实现网络通信

在这里插入图片描述

 socket工作流程

在这里插入图片描述


TCP服务端

首先拿到一个socket对象,socket对象与IP+PORT绑定才能进行端口监听.

然后socket对象监听端口是否有请求,同时调用accept方法,一直阻塞等待客户端的链接;

如果有客户端的请求发来,那么服务端接收到请求之后调用read方法读取数据;

之后再处理请求,写回数据使用write方法(python中是send方法)

当需要断开连接时服务端发送请求,客户端读取之后在调用close方法断开请求,

服务端read收到断开请求,服务端再调用close方法即可.

TCP客户端

首先拿到一个socket对象,调用connect方法,传入IP与PORT,发送建立链接的请求, 

之后就可以进行数据交互, 如果需要结束链接,直接调用close方法即可.

基于TCP 的SOCKET服务端与客户端

基础版本

TCP是基于链接的, 必须先启动服务端,然后再启动客户端去链接服务器

import socket
import time

server = socket.socket()

# 注意: 传入的参数必须是一个元组或者列表
# ip '127.0.0.1'是本地回环地址,只能自己玩
# 如果是别的IP地址,可以在同一个局域网里一起使用
server.bind(('127.0.0.1',8080))


# 监听 半连接池为5,相当于队列中最多有5个, 超出5个就会报错
# 同时智能服务一个人
server.listen(5)


# 等待客户端的链接
# socket 是连接对象, address是客户端地址
# 以后这个服务端和客户端使用sock这个连接对象
sock,address = server.accept()



# 接收客户端发了的数据
# 传入的参数为一次接受的字节
data = sock.recv(1024)

print(f'收到了来自{address}的数据{data.decode("utf8")}')


# 服务端给客户端发送消息
data_send = f'收到了你发送的{data}'.encode('utf8')
# 注意必须传送二进制格式数据
sock.send(data_send)

time.sleep(2)

# 关闭连接对象,此时服务器没有关闭
sock.close()

# 关闭服务端
server.close()


客户端

import socket


client = socket.socket()


# 链接服务端的地址加端口
client.connect(('127.0.0.1,8080))


# 连上以后就可以发送消息了
client.send(b'good evening')


# 收到服务端
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值