电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python 聊聊socket中的listen()參數(數字)到底代表什么

瀏覽:6日期:2022-06-22 11:32:09
疑問

Python 聊聊socket中的listen()參數(數字)到底代表什么

在調用socket的時候,我們會使用到listen()函數,里面有個參數叫backlog, 例如:socket.listen(5). 那么這個數字5到底代表什么意思呢?網上有很多種說法,講的都是概念,很多都是復制粘貼,容易讓人誤解。

解答

下面使用具體的代碼片段來講解:

這是一個電腦本機模擬客服端及服務端的程序,主要功能是建立socket連接后,客戶端輸入關鍵字查詢對應的段子,服務器端返回結果。服務器可以滿足同時服務兩個客戶的查詢操作此程序中還包含了信號量和多線程

Python 聊聊socket中的listen()參數(數字)到底代表什么

以listen(1),參數設置為1進行講解,是不是將參數設置為1后,開啟3個客服連接就會報錯呢?并不是!

如下圖所示:

Python 聊聊socket中的listen()參數(數字)到底代表什么

那么問題來了!

問題1:

如上例代碼中,有listen(1),這個1是指什么?只能與1個socket建立鏈接嗎? 為什么我用上面的代碼可以創建大于1個的tcp連接卻沒報錯,如果用網上其他人的說法理論上大于1個連接應該報錯的!

因為:listen(n)傳入的值, n表示的是服務器拒絕(超過限制數量的)連接之前,操作系統可以掛起的最大連接數量。n也可以看作是'排隊的數量'

問題2:

既然沒有報錯,為什么沒有打印用戶3的地址?

因為:服務器正在處理用戶1和用戶2,沒有空閑去接待用戶3,所以用戶3去排隊了。

問題3:

為什么服務器能同時處理用戶1和用戶2?

因為:

Python 聊聊socket中的listen()參數(數字)到底代表什么

這里用到了多線程和信號量,信號量設置為2,也就是允許并發數為2,服務器開啟了兩個線程,能同時分別處理用戶1和用戶2。

總結

socket.listen(n)

簡單來說,這里的nt表示socket的”排隊個數

一般情況下,一個進程只有一個主線程(也就是單線程),那么socket允許的最大連接數為: n + 1如果服務器是多線程,比如上面的代碼例子是開了2個線程,那么socket允許的最大連接數就是: n + 2換句話說:排隊的人數(就是那個n) + 正在就餐的人數(服務器正在處理的socket連接數) = 允許接待的總人數(socket允許的最大連接數)

補充:關于Socket.listen方法的一點體悟

前言

最近在接觸Socket的的時候,關于其中的listen方法感到不解,于是對其進行了一番研究,得出了一點體悟,特此記錄。

詳解

讓我們先來看看listen方法在Python3.6文檔說明:

socket.listen([backlog])

Enable a server to accept connections. If backlog is specified, it must be at least 0 (if it is lower, it is set to 0); it specifies the number of unaccepted connections that the system will allow before refusing new connections. If not specified, a default reasonable value is chosen.

啟用服務器以接受連接。如果指定backlog,則必須至少為0(如果低于0,則設置為0);它指定系統在拒絕新連接之前將允許的未接受連接的數量。如果未指定,則選擇默認的合理值。

Changed in version 3.5: The backlog parameter is now optional.

在版本3.5中已更改: backlog參數現在是可選的。

起初我看了這說明想當然的以為是可以接入的Client上限,不過實踐過后發現并非如此。在網上找的解答基本上就是文檔所言的復述,后來請教了專業人士后,方知這涉及到Socket的底層知識。

在了解listen方法之前,首先我們需要了解connect方法和accept方法,以下是文檔說明:

socket.connect(address)

Connect to a remote socket at address. (The format of address depends on the address family — see above.)

在地址連接到遠程套接字。(地址的格式取決于地址系列 - 請參見上文)

If the connection is interrupted by a signal, the method waits until the connection completes, or raise a socket.timeout on timeout, if the signal handler doesn’t raise an exception and the socket is blocking or has a timeout. For non-blocking sockets, the method raises an InterruptedError exception if the connection is interrupted by a signal (or the exception raised by the signal handler).

如果連接被信號中斷,則該方法等待直到連接完成,或者如果信號處理程序沒有引發異常并且套接字正在阻塞或者已經阻塞,則在超時時引入socket.timeout超時。對于非阻塞套接字,如果連接被信號中斷(或由信號處理程序引發的異常),則該方法引發InterruptedError異常。

Changed in version 3.5: The method now waits until the connection completes instead of raising an InterruptedError exception if the connection is interrupted by a signal, the signal handler doesn’t raise an exception and the socket is blocking or has a timeout (see the PEP 475 for the rationale).

在版本3.5中已更改:該方法現在等待直到連接完成,而不是提高InterruptedError異常,如果連接被信號中斷,信號處理程序不引發異常,套接字阻塞或超時(參見 PEP 475)。

socket.accept()

Accept a connection. The socket must be bound to an address and listening for connections. The return value is a pair (conn, address) where conn is a new socket object usable to send and receive data on the connection, and address is the address bound to the socket on the other end of the connection.

接收一個連接.該socket 必須要綁定一個地址和監聽連接.返回值是一對(conn, 地址)其中conn是新 t4 > socket對象可用于在連接上發送和接收數據,address是連接另一端的套接字的地址。

The newly created socket is non-inheritable.

新創建的套接字non-inheritable。

Changed in version 3.4: The socket is now non-inheritable.

在版本3.4中更改:套接字現在是不可繼承的。

Changed in version 3.5: If the system call is interrupted and the signal handler does not raise an exception, the method now retries the system call instead of raising an InterruptedError exception (see PEP 475 for the rationale).

在版本3.5中更改:如果系統調用中斷并且信號處理程序沒有引發異常,則此方法現在重試系統調用,而不是引發InterruptedError異常 PEP 475)。

相比listen方法,它倆就好理解多了,一個是Client用于連接Server的方法,一個是Server用于接收Client的連接申請的方法。

但事實上accept方法一次只能接收一個Client的連接申請,而Client則是多個的,這樣Socket會設計一個隊列來存儲Client的連接申請則是理所當然的。于是accept便從這個隊列里提取首位成員處理即可。

以下是示意圖:

Python 聊聊socket中的listen()參數(數字)到底代表什么

如此便很清晰了,backlog參數的含義便是這個隊列的最大值,也就是同時受理連接申請的最大值。關于backlog該設置為多少,從Skynet得到的參考為32。如果滿了便需要Client重新connect。以上listen方法之謎便解開了。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 波纹补偿器_不锈钢波纹补偿器_巩义市润达管道设备制造有限公司 | 法钢特种钢材(上海)有限公司 - 耐磨钢板、高强度钢板销售加工 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 水厂自动化|污水处理中控系统|水利信息化|智慧水务|智慧农业-山东德艾自动化科技有限公司 | 工业车间焊接-整体|集中除尘设备-激光|等离子切割机配套除尘-粉尘烟尘净化治理厂家-山东美蓝环保科技有限公司 | 低温等离子清洗机(双气路进口)-嘉润万丰| 附着力促进剂-尼龙处理剂-PP处理剂-金属附着力处理剂-东莞市炅盛塑胶科技有限公司 | 风淋室生产厂家报价_传递窗|送风口|臭氧机|FFU-山东盛之源净化设备 | 三效蒸发器_多效蒸发器价格_四效三效蒸发器厂家-青岛康景辉 | 视觉检测设备_自动化检测设备_CCD视觉检测机_外观缺陷检测-瑞智光电 | 电动车头盔厂家_赠品头盔_安全帽批发_山东摩托车头盔—临沂承福头盔 | 华禹护栏|锌钢护栏_阳台护栏_护栏厂家-华禹专注阳台护栏、楼梯栏杆、百叶窗、空调架、基坑护栏、道路护栏等锌钢护栏产品的生产销售。 | 阿尔法-MDR2000无转子硫化仪-STM566 SATRA拉力试验机-青岛阿尔法仪器有限公司 | 广州迈驰新GMP兽药包装机首页_药品包装机_中药散剂包装机 | 电磁铁_推拉电磁铁_机械手电磁吸盘电磁铁厂家-广州思德隆电子公司 | 货车视频监控,油管家,货车油管家-淄博世纪锐行电子科技 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | 重庆监控_电子围栏设备安装公司_门禁停车场管理系统-劲浪科技公司 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 电脑知识|软件|系统|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网 | 内六角扳手「厂家」-温州市威豪五金工具有限公司 | 干洗店加盟_洗衣店加盟_干洗店设备-伊蔻干洗「武汉总部」 | 江西高职单独招生-江西单招考试-江西高职单招网 | 洛阳永磁工业大吊扇研发生产-工厂通风降温解决方案提供商-中实洛阳环境科技有限公司 | 臭氧发生器_臭氧消毒机 - 【同林品牌 实力厂家】 | 披萨石_披萨盘_电器家电隔热绵加工定制_佛山市南海区西樵南方综合保温材料厂 | 贴片电容-贴片电阻-二三极管-国巨|三星|风华贴片电容代理商-深圳伟哲电子 | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 | 山东成考网-山东成人高考网| 手术室净化装修-手术室净化工程公司-华锐手术室净化厂家 | 土壤检测仪器_行星式球磨仪_土壤团粒分析仪厂家_山东莱恩德智能科技有限公司 | 【连江县榕彩涂料有限公司】官方网站 | 专业音响设备_舞台音响设备_会议音响工程-首选深圳一禾科技 | 专业深孔加工_东莞深孔钻加工_东莞深孔钻_东莞深孔加工_模具深孔钻加工厂-东莞市超耀实业有限公司 | 自动部分收集器,进口无油隔膜真空泵,SPME固相微萃取头-上海楚定分析仪器有限公司 | 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | NM-02立式吸污机_ZHCS-02软轴刷_二合一吸刷软轴刷-厦门地坤科技有限公司 | 路斯特伺服驱动器维修,伦茨伺服驱动器维修|万骏自动化百科 | 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 超高频感应加热设备_高频感应电源厂家_CCD视觉检测设备_振动盘视觉检测设备_深圳雨滴科技-深圳市雨滴科技有限公司 | SPC工作站-连杆综合检具-表盘气动量仪-内孔缺陷检测仪-杭州朗多检测仪器有限公司 | 冲锋衣滑雪服厂家-冲锋衣定制工厂-滑雪服加工厂-广东睿牛户外(S-GERT) |