Scoket层

news/2024/11/15 15:33:09/文章来源:https://www.cnblogs.com/chosen-yn/p/18202648

Scoket层

【一】Scoket层在哪

【二】套接字工作流程

  • 一个生活中的场景。

    • 你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。
    • 等交流结束,挂断电话结束此次交谈。 生活中的场景就解释了这工作原理。

【0】服务端流程

  • 先从服务器端说起。

    • 服务器端先初始化Socket
    • 然后与端口绑定(bind),对端口进行监听(listen)
    • 调用accept阻塞,等待客户端连接。
    • 在这时如果有个客户端初始化一个Socket
    • 然后连接服务器(connect)
      • 如果连接成功,这时客户端与服务器端的连接就建立了。
    • 客户端发送数据请求,服务器端接收请求并处理请求
    • 然后把回应数据发送给客户端,客户端读取数据
    • 最后关闭连接,一次交互结束
  • socket()模块函数用法

import socketsocket.socket(socket_family,socket_type,protocal=0)socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,默认值为 0。# 获取tcp/ip套接字tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 获取udp/ip套接字udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 由于 socket 模块中有太多的属性。我们在这里破例使用了'from module import *'语句。使用 'from socket import *',我们就把 socket 模块里的所有属性都带到我们的命名空间里了,这样能 大幅减短我们的代码。#  例如tcpSock = socket(AF_INET, SOCK_STREAM

【1】服务端套接字函数

  • s.bind() 绑定(主机,端口号)到套接字
  • s.listen() 开始TCP监听
  • s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来

【2】客户端套接字函数

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

【3】公共用途的套接字函数

  • 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() 关闭套接字

【4】面向锁的套接字方法

  • s.setblocking() 设置套接字的阻塞与非阻塞模式
  • s.settimeout() 设置阻塞套接字操作的超时时间
  • s.gettimeout() 得到阻塞套接字操作的超时时间

【5】面向文件的套接字的函数

  • s.fileno() 套接字的文件描述符
  • s.makefile() 创建一个与该套接字相关的文件

【三】基于TCP的套接字

【1】方法简介

  • tcp是基于链接的

    • 必须先启动服务端
    • 然后再启动客户端去链接服务端
  • tcp服务端

server = socket() #创建服务器套接字
server.bind()      #把地址绑定到套接字
server.listen()      #监听链接
inf_loop:      #服务器无限循环conn = server.accept() #接受客户端链接comm_loop:         #通讯循环conn.recv()/conn.send() #对话(接收与发送)conn.close()    #关闭客户端套接字
server.close()        #关闭服务器套接字(可选)
  • tcp 客户端
client = socket()    # 创建客户套接字
client.connect()    # 尝试连接服务器
comm_loop:        # 通讯循环client.send()/client.recv()    # 对话(发送/接收)
client.close()            # 关闭客户套接字

【2】打电话模型

  • socket通信流程与打电话流程类似

    • 我们就以打电话为例来实现一个low版的套接字通信

(1)服务端

import socketip_port = ('127.0.0.1', 9000)  # 电话卡
BUFSIZE = 1024  # 收发消息的尺寸
servser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 买手机
servser.bind(ip_port)  # 手机插卡
servser.listen(5)  # 手机待机conn, addr = servser.accept()  # 手机接电话
# print(conn)
# print(addr)
print('接到来自%s的电话' % addr[0])msg = conn.recv(BUFSIZE)  # 听消息,听话
print(msg, type(msg))conn.send(msg.upper())  # 发消息,说话conn.close()  # 挂电话servser.close()  # 手机关机

(2)客户端

import socketip_port = ('127.0.0.1', 9000)
BUFSIZE = 1024
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.connect_ex(ip_port)  # 拨电话client.send('dream is handsome'.encode('utf-8'))  # 发消息,说话(只能发送字节类型)feedback = client.recv(BUFSIZE)  # 收消息,听话
print(feedback.decode('utf-8'))client.close()  # 挂电话

【3】打电话模型升级

  • 加上链接循环与通信循环
import socket# 电话卡
ip_port = ('127.0.0.1', 8081)
BUFSIZE = 1024# 买手机
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 手机插卡
server.bind(ip_port)# 手机待机
server.listen(5)# 新增接收链接循环,可以不停的接电话
while True:# 手机接电话conn, addr = s.accept()# print(conn)# print(addr)print('接到来自%s的电话' % addr[0])# 新增通信循环,可以不断的通信,收发消息while True:# 听消息,听话msg = conn.recv(BUFSIZE)# 如果不加,那么正在链接的客户端突然断开,recv便不再阻塞,死循环发生# if len(msg) == 0:break        print(msg, type(msg))# 发消息,说话conn.send(msg.upper())# 挂电话conn.close()# 手机关机
server.close()
  • 客户端改进版
import socketip_port = ('127.0.0.1', 8081)
BUFSIZE = 1024
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 拨电话
client.connect_ex(ip_port)  # 新增通信循环,客户端可以不断发收消息
while True:  msg = input('>>: ').strip()if len(msg) == 0: continue# 发消息,说话(只能发送字节类型)client.send(msg.encode('utf-8'))# 收消息,听话feedback = client.recv(BUFSIZE)  print(feedback.decode('utf-8'))# 挂电话
client.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/709381.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提升效率必备VSCode运行快捷键全攻略

哈喽,大家好,我是木头左!快捷启航:打开你的代码世界 在编程的世界里,时间就是金钱。了解并熟练使用Visual Studio Code(简称VSCode)的运行快捷键,可以大大节省你的时间,让你更加专注于代码逻辑和创意实现。本篇文章将为你揭示那些鲜为人知但异常强大的VSCode运行快捷键…

逆向 | 驱动挂靠进程直接读内存

逆向 | 驱动挂靠进程直接读内存参考:https://cloud.tencent.com/developer/article/2358904 https://github.com/Whitebird0/driver_read_and_write/blob/main/04-读写内存/ReadMemory.c 代码如下: 代码不长但是有坑,比如说ExAllocatePool2的参数就跟之前不一样了,这个点我…

聊聊 JSON Web Token (JWT) 和 jwcrypto 的使用

哈喽大家好,我是咸鱼。 最近写的一个 Python 项目用到了 jwcrypto 这个库,这个库是专门用来处理 JWT 的,JWT 全称是 JSON Web Token ,JSON 格式的 Token。 今天就来简单入门一下 JWT。官方介绍:https://jwt.io/introduction 先聊聊 Token Token 的意思是令牌,通常用于身份…

CC2530 zigebee 实现低功耗

​ZigBee网络低功耗运行一直是苦逼攻城狮们要解决的问题,TI的CC2530可以说已经把终端的休眠功耗降低到了极致,现在我们就来体验这颗芯片的魅力!文章末尾分享完整源码和PCB工程文件。 一、CC2530供电模式 CC2530芯片有五种运行模式,分别为主动模式、空闲模式、PM1、PM2和PM3…

『手撕Vue-CLI』处理不同指令

前言 在上一篇『手撕Vue-CLI』添加自定义指令中,已经实现了自定义指令的添加,但是指令还是比较简单的,只是简单的打印一句话,那么在实际运用场景中,可能会有更多的需求,比如可能需要在指令中传递参数,或者需要在指令中进行一些复杂的操作,那么这个时候我们就需要对指令…

信息安全事件应急处理报告模板

一、概述 1.1 应急处理服务背景 Fesco 单位与星际和平公司签订应急服务合同。星际和平公司根据合同协议中规定的范围和工作内容为 Fesco 单位提供应急服务。2024 年 5 月 20 日 Fesco 单位网站服务器发现存在恶意文件,直接威胁网站的正常运营与使用,Fesco 单位立即拨通星际和…

linux 数据库安装配置

如果有原来的数据库,需要先卸载 摘自https://blog.csdn.net/weixin_50367873/article/details/134551859, 本文通过yum安装mysql,如需离线安装mysql,查看原文 1. 检查是否有mariadb存在,centos默认自带ps ajx | grep mariadb 查找是否存在systemctl stop mariadb.service …

无界微前端

https://zhuanlan.zhihu.com/p/657544258背景 什么是微前端 微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略 玉伯:今天看各 BU 的业务问题,微前端的前提,还是得有主体应用,然后才有微组件或微应用,解决的是可控体系下的前端协…

[MySQL]存储过程

本篇文章阐述的原则是“以吾之理解,着重之阐述”,因此没有那么细致。 如果文中阐述不全或不对的,多多交流。【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18032044 出自【进步*于辰的博客】存储过程的细节很多…

esp8266-01 使用介绍

一、直接使用接线esp8266USB转TTl说明TX RX ------RX TX ------EN 3.3V AT命令 需要拉高 ------3V3 3.3V ------IO0 不接 IO0接地进入烧录模式GND GND ------二、固件烧写 前提说明一般是模块固件损坏或者买回来里面可能被别人刷过固件需要擦除或者增加固件才用,在这里结合我…

[转帖]Linux内存管理基本概念

最近在学习Linux系统的内存管理,小白一枚,零散从网上收集的一些笔记如下: /proc目录提供了很多工具给我们查看当前内存情况 1. /proc/meminfo是什么 $cat /proc/meminfoMemTotal: 2052440 kB //总内存MemFree: 50004 kB //空闲内存Buffers: 1…