Python3 socket

什么是sockets

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

socket起源于UNIX栅组,在Unix一切皆文件哲學(xué)的思想下,socket是一種"打開—讀/寫—關(guān)閉"模式的實(shí)現(xiàn)梅掠,服務(wù)器和客戶端各自維護(hù)一個(gè)"文件"酌住,在建立連接打開后店归,可以向自己文件寫入內(nèi)容供對(duì)方讀取或者讀取對(duì)方內(nèi)容,通訊結(jié)束時(shí)關(guān)閉文件酪我。

socket的英文原義是“插槽”或“插座”消痛,就像我們家里座機(jī)一樣,如果沒有網(wǎng)線的那個(gè)插口都哭,電話是無法通信的肄满。Socket是實(shí)現(xiàn)TCP,UDP協(xié)議的接口质涛,便于使用TCP,UDP。

基本上掰担,Socket 是任何一種計(jì)算機(jī)網(wǎng)絡(luò)通訊中最基礎(chǔ)的內(nèi)容汇陆。例如當(dāng)你在瀏覽器地址欄中輸入 http://www.cnblogs.com/ 時(shí),你會(huì)打開一個(gè)套接字带饱,然后連接到 http://www.cnblogs.com/ 并讀取響應(yīng)的頁面然后然后顯示出來毡代。而其他一些聊天客戶端如 gtalk 和 skype 也是類似。任何網(wǎng)絡(luò)通訊都是通過 Socket 來完成的勺疼。

Python 官方關(guān)于 Socket 的函數(shù)請(qǐng)看http://docs.python.org/library/socket.html

socket和file的區(qū)別:

1教寂、file模塊是針對(duì)某個(gè)指定文件進(jìn)行【打開】【讀寫】【關(guān)閉】

2、socket模塊是針對(duì) 服務(wù)器端 和 客戶端Socket 進(jìn)行【打開】【讀寫】【關(guān)閉】

運(yùn)行過程

首先啟動(dòng)服務(wù)端执庐,監(jiān)聽請(qǐng)求酪耕;

然后通過客戶端去發(fā)出請(qǐng)求;

接下來觀察輸出轨淌;

運(yùn)行流程圖

image.png

常用函數(shù)

服務(wù)器端
  • s.bind()
    綁定地址(host,port)到套接字迂烁, 在AF_INET下,以元組(host,port)的形式表示地址。
  • s.listen()
    開始TCP監(jiān)聽递鹉。backlog指定在拒絕連接之前盟步,操作系統(tǒng)可以掛起的最大連接數(shù)量。該值至少為1躏结,大部分應(yīng)用程序設(shè)為5就可以了却盘。
  • s.accept()
    被動(dòng)接受TCP客戶端連接,(阻塞式)等待連接的到來
客戶端
  • s.connect()
    主動(dòng)初始化TCP服務(wù)器連接,媳拴。一般address的格式為元組(hostname,port)黄橘,如果連接出錯(cuò),返回socket.error錯(cuò)誤禀挫。
  • s.connect_ex()
    connect()函數(shù)的擴(kuò)展版本,出錯(cuò)時(shí)返回出錯(cuò)碼,而不是拋出異常
公共用途的函數(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.sendall()
    完整發(fā)送TCP數(shù)據(jù)溉痢,完整發(fā)送TCP數(shù)據(jù)。將string中的數(shù)據(jù)發(fā)送到連接的套接字憋他,但在返回之前會(huì)嘗試發(fā)送所有數(shù)據(jù)孩饼。成功返回None,失敗則拋出異常竹挡。

  • s.close()
    關(guān)閉套接字

  • s.recvform()
    接收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ù)。

  • s.getpeername()
    返回連接套接字的遠(yuǎn)程地址搅窿。返回值通常是元組(ipaddr,port)嘁酿。

  • s.getsockname()
    返回套接字自己的地址。通常是一個(gè)元組(ipaddr,port)

  • s.setsockopt(level,optname,value)
    設(shè)置給定套接字選項(xiàng)的值男应。

  • s.getsockopt(level,optname[.buflen])
    返回套接字選項(xiàng)的值闹司。

  • s.settimeout(timeout)
    設(shè)置套接字操作的超時(shí)期,timeout是一個(gè)浮點(diǎn)數(shù)沐飘,單位是秒游桩。值為None表示沒有超時(shí)期。一般耐朴,超時(shí)期應(yīng)該在剛創(chuàng)建套接字時(shí)設(shè)置借卧,因?yàn)樗鼈兛赡苡糜谶B接的操作(如connect())

  • s.gettimeout()
    返回當(dāng)前超時(shí)期的值,單位是秒筛峭,如果沒有設(shè)置超時(shí)期铐刘,則返回None。

  • s.fileno()
    返回套接字的文件描述符影晓。

  • s.setblocking(flag)
    如果flag為0镰吵,則將套接字設(shè)為非阻塞模式檩禾,否則將套接字設(shè)為阻塞模式(默認(rèn)值)。非阻塞模式下疤祭,如果調(diào)用recv()沒有發(fā)現(xiàn)任何數(shù)據(jù)盼产,或send()調(diào)用無法立即發(fā)送數(shù)據(jù),那么將引起socket.error異常勺馆。

  • s.makefile()
    創(chuàng)建一個(gè)與該套接字相關(guān)連的文件

服務(wù)器端代碼SocketServer.py

import socket

s = socket.socket()
host = '0.0.0.0'
port = 9630
s.bind((host, port))
s.listen(5)

while True:
    c, addr = s.accept()
    print('Received message == {0}'.format(c.recv(1024).decode('utf-8')))
    c.send(b'this come from server')
    c.close()

客戶端源代碼SocketClient.py:

import socket

c = socket.socket()
host = '192.168.1.1'
port = 9630
c.connect((host, port))
print('已連接 {0}'.format(host))
c.sendall(b"this come from client")
print(c.recv(1024).decode('utf-8'))

自己的理解

  • 對(duì)于信息的傳遞戏售,如果之前的send消息沒被對(duì)端recv,那么這一次的send會(huì)尾接上次信息草穆,直到recv才會(huì)清空消息隊(duì)列灌灾。
  • 在服務(wù)器端執(zhí)行了close后,之后客戶端再次send時(shí)悲柱,服務(wù)端不會(huì)處理
  • 一次連接只能接受一次sendall

參考文章

http://www.cnblogs.com/idontknowthisperson/p/5958536.html
http://www.cnblogs.com/aylin/p/5572104.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末紧卒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子诗祸,更是在濱河造成了極大的恐慌,老刑警劉巖轴总,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件直颅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡怀樟,警方通過查閱死者的電腦和手機(jī)功偿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來往堡,“玉大人械荷,你說我怎么就攤上這事÷腔遥” “怎么了吨瞎?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)穆咐。 經(jīng)常有香客問我颤诀,道長(zhǎng),這世上最難降的妖魔是什么对湃? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任崖叫,我火速辦了婚禮,結(jié)果婚禮上拍柒,老公的妹妹穿的比我還像新娘心傀。我一直安慰自己,他們只是感情好拆讯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布脂男。 她就那樣靜靜地躺著养叛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疆液。 梳的紋絲不亂的頭發(fā)上一铅,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音堕油,去河邊找鬼潘飘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛掉缺,可吹牛的內(nèi)容都是我干的卜录。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼眶明,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼艰毒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起搜囱,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤丑瞧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蜀肘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绊汹,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年扮宠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了西乖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坛增,死狀恐怖获雕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情收捣,我是刑警寧澤届案,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站罢艾,受9級(jí)特大地震影響萝玷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昆婿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一球碉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧仓蛆,春花似錦睁冬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽直奋。三九已至,卻和暖如春施禾,著一層夾襖步出監(jiān)牢的瞬間脚线,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工弥搞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邮绿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓攀例,卻偏偏與公主長(zhǎng)得像船逮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子粤铭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1挖胃、TCP狀態(tài)linux查看tcp的狀態(tài)命令:1)、netstat -nat 查看TCP各個(gè)狀態(tài)的數(shù)量2)梆惯、lso...
    北辰青閱讀 9,410評(píng)論 0 11
  • 一酱鸭、網(wǎng)絡(luò)各個(gè)協(xié)議:TCP/IP、SOCKET垛吗、HTTP等 網(wǎng)絡(luò)七層由下往上分別為物理層凛辣、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層职烧、傳輸層...
    杯水救車薪閱讀 2,260評(píng)論 0 17
  • socket通信原理 socket又被叫做套接字,它就像連接到兩端的插座孔一樣,通過建立管道,將兩個(gè)不同的進(jìn)程之間...
    jiodg45閱讀 1,126評(píng)論 0 1
  • 晚飯后正压,兒子在看電視我和朋友打了一個(gè)電話瑟枫。每界,很快半個(gè)小時(shí)過來了。我跑到客廳一看躺在沙發(fā)睡著了足删。這幾天由于感冒了睡覺...
    文皓文文媽媽閱讀 175評(píng)論 0 6
  • Cybercrime is out of control. It's everywhere. We hear ab...
    AIAR學(xué)堂閱讀 1,060評(píng)論 0 0