經(jīng)常游戲、刷視頻,卻不了解它們底層的通信機(jī)制嗎?來我給你聊清楚Python Socket通信原理

      網(wǎng)友投稿 624 2025-03-31

      文章目錄

      打開一個(gè)網(wǎng)絡(luò)接口:套接字

      綁定IP與端口:bind

      監(jiān)聽網(wǎng)絡(luò)來信:監(jiān)聽套接字

      接收網(wǎng)絡(luò)來訪者:允許連接

      客戶端方面:申請(qǐng)連接

      關(guān)閉通信套接字:close()

      公共用途的套接字函數(shù)

      服務(wù)端/客戶端,放碼過來

      服務(wù)端

      客戶端

      結(jié)果輸出

      抱歉,我一直堅(jiān)定選擇的是后端,嘿嘿嘿。

      就算是Python,我也要繞回后端來。

      經(jīng)常打游戲、刷視頻,卻不了解它們底層的通信機(jī)制嗎?來我給你聊清楚Python Socket通信原理

      上圖是socket網(wǎng)絡(luò)編程的流程圖

      至于數(shù)據(jù)在網(wǎng)絡(luò)中是怎么走的,咱先不說,那個(gè)太底層了,咱今天見就說如何將數(shù)據(jù)從咱的屏幕上放到網(wǎng)絡(luò)流中去。

      這可不是鍵盤敲敲,回車一按的事情,在這背后,那也是百轉(zhuǎn)千回。

      打開一個(gè)網(wǎng)絡(luò)接口:套接字

      Socket又稱"套接字",應(yīng)用程序通常通過"套接字"向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求,使主機(jī)間或者一臺(tái)計(jì)算機(jī)上的進(jìn)程間可以通訊。

      Python 中,我們用 socket()函數(shù)來創(chuàng)建套接字,語法格式如下:

      import socket # 居然是個(gè)內(nèi)置模塊 socket.socket([family[, type[, proto]]])

      1

      2

      參數(shù)釋義:

      family: 套接字家族可以使 AF_UNIX(本地協(xié)議) 或者 AF_INET(產(chǎn)生IPV4)。 type: 套接字類型可以根據(jù)是面向連接的還是非連接分為 SOCK_STREAM(這個(gè)協(xié)議是按照順序的、可靠的、數(shù)據(jù)完整的基于字節(jié)流的連接。這是一個(gè)使用最多的socket類型,是用TCP協(xié)議來傳輸?shù)摹#?或 SOCK_DGRAM(這個(gè)協(xié)議是無連接的,固定長(zhǎng)度的連接調(diào)用。該協(xié)議是不可靠的,使用UDP來進(jìn)行它的連接。)。 protocol: 一般不填默認(rèn)為 0。

      1

      2

      3

      4

      5

      返回值:返回一個(gè)通信套接字,為本機(jī)向網(wǎng)絡(luò)通信的接口。

      綁定IP與端口:bind

      bind() 用來關(guān)聯(lián) socket 到指定的網(wǎng)絡(luò)接口(IP 地址)和端口號(hào):

      bind(hostname,port)

      1

      參數(shù)釋義:

      hostname:主機(jī)IP port:進(jìn)行網(wǎng)絡(luò)通信的端口

      1

      2

      127.0.0.1 是標(biāo)準(zhǔn)的 IPv4 回環(huán)地址,只有主機(jī)上的進(jìn)程可以連接到服務(wù)器,如果你傳了空字符串,服務(wù)器將接受本機(jī)所有可用的 IPv4 地址。

      端口號(hào)應(yīng)該是 1-65535 之間的整數(shù)(0是保留的),這個(gè)整數(shù)就是用來接受客戶端鏈接的 TCP 端口號(hào),如果端口號(hào)小于 1024,有的操作系統(tǒng)會(huì)要求管理員權(quán)限。

      監(jiān)聽網(wǎng)絡(luò)來信:監(jiān)聽套接字

      listen(backlog) #開始 TCP 監(jiān)聽。

      1

      參數(shù)釋義:

      backlog 指定在拒絕連接之前,操作系統(tǒng)可以掛起的最大連接數(shù)量。該值至少為 1,大部分應(yīng)用程序設(shè)為 5 就可以,做并發(fā)的話可以設(shè)大一些,比方說20。

      函數(shù)listen用來初始化服務(wù)器可連接隊(duì)列。 服務(wù)器處理客戶端連接時(shí)是順序處理的,同一時(shí)間只能處理一個(gè)客戶端連接。 當(dāng)多個(gè)客戶端的連接請(qǐng)求同時(shí)到來的時(shí)候,服務(wù)器將不能處理的客戶端連接請(qǐng)求放入到等待隊(duì)列中,這個(gè)隊(duì)列的長(zhǎng)度由listen()函數(shù)來指定。 (這里面包括了還沒握手的、一次握手的、兩次握手的,只要還沒握完,通通進(jìn)去待著) 大多數(shù)系統(tǒng)的設(shè)置為20,其實(shí)真的沒必要太多,真的。 根據(jù)系統(tǒng)的可承受負(fù)載和程序的需求來確定。 系統(tǒng)有一個(gè)最大偵聽隊(duì)列數(shù),一般是128(somaxconn),可以調(diào)優(yōu)。

      1

      2

      3

      4

      5

      6

      7

      8

      接收網(wǎng)絡(luò)來訪者:允許連接

      accept() #被動(dòng)接受TCP客戶端連接,(阻塞式)等待連接的到來

      1

      accept() 方法阻塞并等待傳入連接。當(dāng)一個(gè)客戶端連接時(shí),它將返回一個(gè)新的 socket 對(duì)象,對(duì)象中有表示當(dāng)前連接的 conn 和一個(gè)由主機(jī)、端口號(hào)組成的 IPv4/v6 連接的元組。

      我們將用這個(gè) socket 對(duì)象和客戶端進(jìn)行通信。

      客戶端方面:申請(qǐng)連接

      connect((HOST, PORT))

      1

      參數(shù)不用我再釋義了吧。返回一個(gè)通信套接字。

      主動(dòng)初始化TCP服務(wù)器連接,。一般address的格式為元組(hostname,port),如果連接出錯(cuò),返回socket.error錯(cuò)誤。

      connect_ex() connect()函數(shù)的擴(kuò)展版本,出錯(cuò)時(shí)返回出錯(cuò)碼,而不是拋出異常。

      關(guān)閉通信套接字:close()

      用于關(guān)閉對(duì)某一個(gè)套接字的函數(shù)。

      公共用途的套接字函數(shù)

      s.recv() # 接收 TCP 數(shù)據(jù),數(shù)據(jù)以字符串形式返回,bufsize 指定要接收的最大數(shù)據(jù)量。flag 提供有關(guān)消息的其他信息,通常可以忽略。 s.send() # 發(fā)送 TCP 數(shù)據(jù),將 string 中的數(shù)據(jù)發(fā)送到連接的套接字。返回值是要發(fā)送的字節(jié)數(shù)量,該數(shù)量可能小于 string 的字節(jié)大小。 s.recvfrom() # 接收 UDP 數(shù)據(jù),與 recv() 類似,但返回值是(data,address)。其中 data 是包含接收數(shù)據(jù)的字符串,address 是發(fā)送數(shù)據(jù)的套接字地址。 s.sendto() # 發(fā)送 UDP 數(shù)據(jù),將數(shù)據(jù)發(fā)送到套接字,address 是形式為(ipaddr,port)的元組,指定遠(yuǎn)程地址。返回值是發(fā)送的字節(jié)數(shù)。

      1

      2

      3

      4

      這里面函數(shù)要拿出來單講都能寫一篇。

      服務(wù)端/客戶端,放碼過來

      我先打個(gè)樣兒,后來人可以直接拿去修改了自己用:

      服務(wù)端

      import socket # create a socket object serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # get local machine name host = socket.gethostname() port = 8088 # bind to the port serversocket.bind((host, port)) print("Server start at port: 8088") # queue up to 5 requests serversocket.listen(5) while True: # establish a connection clientsocket,addr = serversocket.accept() print("Got a connection from %s" % str(addr)) msg='Thank you for connecting'+ "\r\n" clientsocket.send(msg.encode('utf-8')) clientsocket.close()

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      客戶端

      import socket # create a socket object s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # get local machine name host = socket.gethostname() port = 8088 # connection to hostname on the port. s.connect((host, port)) # Receive no more than 1024 bytes msg = s.recv(1024) s.close() print (msg.decode('ascii'))

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      結(jié)果輸出

      Server start at port: 8088 Got a connection from ('172.28.47.243', 9599)

      1

      2

      Thank you for connecting

      1

      本文是處理單連接的,這是一種場(chǎng)景,不過更過的場(chǎng)景是處理多連接,大并發(fā)的。

      后面會(huì)出啦,我先去調(diào)查一下Python是否支持epoll。

      因?yàn)檫@篇主要是為我六月份的那個(gè)項(xiàng)目服務(wù)的,所以連接足夠用啦。

      5G游戲 Python Socket編程

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:在線共享表格為啥不讓填寫(在線共享表格為啥不讓填寫名字)
      下一篇:怎么把框格改小(怎么把格子調(diào)小)
      相關(guān)文章
      亚洲第一区香蕉_国产a| 337p日本欧洲亚洲大胆色噜噜| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 亚洲色精品vr一区二区三区| 亚洲AV网站在线观看| 亚洲国产精品无码久久九九大片 | 亚洲av片不卡无码久久| 亚洲国产成人va在线观看网址| 亚洲欧洲高清有无| 亚洲国产精品午夜电影| 亚洲人成高清在线播放| 国产成人精品日本亚洲18图| 中文字幕在线观看亚洲视频| 亚洲中文字幕久久精品无码A | 亚洲性久久久影院| 亚洲性久久久影院| 亚洲中久无码永久在线观看同| 中国亚洲女人69内射少妇| 久久国产亚洲精品麻豆| 亚洲高清在线视频| 亚洲欧洲国产经精品香蕉网| 亚洲avav天堂av在线网爱情| 亚洲精品午夜国产va久久| 亚洲乱妇熟女爽到高潮的片 | 亚洲AV无码专区在线播放中文| 亚洲福利在线视频| 亚洲成在人线中文字幕| 亚洲AV无码乱码在线观看代蜜桃| 亚洲国产成a人v在线观看 | 久久久久久久亚洲精品| 亚洲国产精品无码久久久蜜芽| 亚洲久本草在线中文字幕| 亚洲最大中文字幕| 亚洲乱理伦片在线观看中字| 亚洲精品WWW久久久久久| 亚洲婷婷五月综合狠狠爱| 久久亚洲伊人中字综合精品| 亚洲精品白色在线发布| 亚洲人成人伊人成综合网无码| 精品久久久久久久久亚洲偷窥女厕| 亚洲国产精品一区二区第四页|