Socket通信Python實(shí)現(xiàn)

Socket通信Python實(shí)現(xiàn)

最近開始看一本非常經(jīng)典的網(wǎng)絡(luò)教程,計(jì)算機(jī)網(wǎng)絡(luò)教程:自頂向下方法捉撮,這本書的是從應(yīng)用層開始寫起怕品,相對于以前坑爹的本科生教程更容易令讀者感興趣,并且循循誘導(dǎo)巾遭,深入淺出肉康,是本難得的網(wǎng)絡(luò)教程。

第二章有一個編程作業(yè)就是實(shí)現(xiàn)簡單的Socket通信灼舍,這篇文章結(jié)合UDP和TCP的原理講一下相關(guān)代碼吼和。值得注意的是文章中的代碼使用的Python3.6的版本,所有的網(wǎng)絡(luò)傳輸默認(rèn)傳遞的是二進(jìn)制比特流骑素,因此采用了utf-8進(jìn)行編碼

1.Socket

Socket中文就是套接字炫乓,它是進(jìn)程和網(wǎng)絡(luò)之間的通信接口,可以簡單認(rèn)為它就是一個API献丑,一個Socket由IP+Port構(gòu)成末捣,兩個進(jìn)程間如果需要通過網(wǎng)絡(luò)通信,那么他們各自需要通過相同的Socket從網(wǎng)絡(luò)中讀/寫數(shù)據(jù)创橄,具體過程可以從下圖了解箩做。

進(jìn)程通過Socket通信

2.UDP

首先,UDP是一個面向無連接的傳輸層協(xié)議妥畏,它在服務(wù)器端和客戶端的功能沒有太大區(qū)別邦邦,只用創(chuàng)建一個套接字,按照預(yù)定的業(yè)務(wù)或邏輯從套接字中進(jìn)行讀寫醉蚁。文章中UDP通信目的是利用客戶端發(fā)送小寫字符串燃辖,服務(wù)端將該字符串轉(zhuǎn)換為大寫并返回。

UDP通信過程

2.1 UDP客戶端代碼

按照UDP通信流程圖馍管,首先創(chuàng)建了套接字郭赐,設(shè)定服務(wù)端的IP地址和端口號薪韩,并組成Socket确沸。再通過AF_INET設(shè)定網(wǎng)絡(luò)協(xié)議為IPv4,SOCK_DGRAM設(shè)置傳輸層使用UDP俘陷。

from socket import *
class UdpClient:
    serverName = '127.0.0.1'
    serverPort = 12000
    socketAddress = (serverName, serverPort)
    def __init__(self):
        #define the type of socket is IPv4 and Udp
        self.clientSocket = socket(AF_INET, SOCK_DGRAM)
        while True:
            message = input("Input a lowercase sentence\n")
            self.clientSocket.sendto(message.encode('utf-8'), self.socketAddress)
            returnMessage, serverAddress = self.clientSocket.recvfrom(2048)
            if not returnMessage:
                break
            print("The peersocket is: %s:%s" %(serverAddress[0], serverAddress[1]))
            print("The return message is: %s" %returnMessage.decode('utf-8'))
if __name__ == '__main__':
    client = UdpClient()

2.2 UDP服務(wù)端代碼

服務(wù)端代碼和客戶端沒有太多區(qū)別罗捎。

from socket import *

serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('',serverPort))
print('Waiting for connection...')
while True:
    message, clientAddress = serverSocket.recvfrom(2048)
    print('Receive Message: %s' %message.decode('utf-8'))
    modifiedMessage = message.decode('utf-8').upper()
    serverSocket.sendto(modifiedMessage.encode('utf-8'), clientAddress)

3.TCP

TCP是面向連接的傳輸協(xié)議,需要三次握手建立連接拉盾,應(yīng)用需要綁定Socket桨菜。相對于UDP多了listenacceptconnect的過程。

TCP通信流程

3.1 TCP客戶端

客戶端代碼如下倒得,主要實(shí)現(xiàn)從服務(wù)端返回當(dāng)前時鐘的功能泻红,與UDP的代碼相差不大,因?yàn)槭敲嫦蜻B接霞掺,所有需要多一個connect的過程:

from socket import *

serverName = '127.0.0.1'
serverPort = 11000
BUFSIZ = 1024
ADDR = (serverName,serverPort)

clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect(ADDR)

while True:
    data = "client message"
    if not data:
        break
    clientSocket.send(data.encode('utf-8'))
    returnData = clientSocket.recv(BUFSIZ)
    if not returnData:
        break
    print('Return time is:%s' %returnData.decode('utf-8'))
clientSocket.close()

3.2 TCP服務(wù)端

服務(wù)端主要做了以下工作谊路,首先綁定一個套接字,用于監(jiān)聽客戶端的服務(wù)請求菩彬,同時這里利用listen(5)設(shè)定最大的tcp連接數(shù)為5缠劝,然后進(jìn)入循環(huán),每次循環(huán)記錄當(dāng)前客戶端的socket骗灶,并處理相應(yīng)地業(yè)務(wù):

from socket import *
from time import ctime

host = ''
port = 11000
ADDR = (host, port)
BUFSIZ = 1024

tcpSocket = socket(AF_INET, SOCK_STREAM)
tcpSocket.bind(ADDR)
#set the max number of tcp connection
tcpSocket.listen(5)

while True:
    print('waiting for connection...')
    clientSocket, clientAddr = tcpSocket.accept()
    print('conneted form: %s' %clientAddr[0])

    while True:
        try:
            data = clientSocket.recv(BUFSIZ)
        except IOError as e:
            print(e)
            clientSocket.close()
            break
        if not data:
            break
        returnData = ctime()+data.decode('utf-8')
        clientSocket.send(returnData.encode('utf-8'))
    clientSocket.close()
tcpSocket.close()

這里是需要先運(yùn)行server的code惨恭,再執(zhí)行client的code:

?  Py python3 TcpServer.py
?  Py python3 TcpClient.py

Client log:

Return time is:Sun Dec 16 17:04:10 2018client message
Return time is:Sun Dec 16 17:04:10 2018client message
...

小結(jié)

Socket是網(wǎng)絡(luò)通信中的一項(xiàng)重要技術(shù),也是一種進(jìn)程通信的手段耙旦,這里列出了一個簡單的實(shí)現(xiàn)版本脱羡,有時間希望可以結(jié)合多線程完善該功能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末免都,一起剝皮案震驚了整個濱河市轻黑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琴昆,老刑警劉巖氓鄙,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異业舍,居然都是意外死亡抖拦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門舷暮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來态罪,“玉大人,你說我怎么就攤上這事下面「淳保” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵沥割,是天一觀的道長耗啦。 經(jīng)常有香客問我,道長机杜,這世上最難降的妖魔是什么帜讲? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮椒拗,結(jié)果婚禮上似将,老公的妹妹穿的比我還像新娘获黔。我一直安慰自己,他們只是感情好在验,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布玷氏。 她就那樣靜靜地躺著,像睡著了一般腋舌。 火紅的嫁衣襯著肌膚如雪预茄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天侦厚,我揣著相機(jī)與錄音耻陕,去河邊找鬼。 笑死刨沦,一個胖子當(dāng)著我的面吹牛诗宣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播想诅,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼召庞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了来破?” 一聲冷哼從身側(cè)響起篮灼,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎徘禁,沒想到半個月后诅诱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡送朱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年娘荡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驶沼。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡炮沐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出回怜,到底是詐尸還是另有隱情大年,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布玉雾,位于F島的核電站翔试,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抹凳。R本人自食惡果不足惜遏餐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一伦腐、第九天 我趴在偏房一處隱蔽的房頂上張望赢底。 院中可真熱鬧,春花似錦、人聲如沸幸冻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洽损。三九已至庞溜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碑定,已是汗流浹背流码。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留延刘,地道東北人漫试。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像碘赖,于是被迫代替她去往敵國和親驾荣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

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

  • 參考:http://www.2cto.com/net/201611/569006.html TCP HTTP UD...
    F麥子閱讀 2,945評論 0 14
  • 1.1 TCP/IP協(xié)議組 TCP/IP協(xié)議(傳輸控制協(xié)議)由網(wǎng)絡(luò)層的IP協(xié)議和傳輸層的TCP協(xié)議組成 IP層負(fù)責(zé)...
    F麥子閱讀 2,784評論 0 25
  • 深夜十二點(diǎn)多妻率,失眠了,我也不知道原因是什么板祝,以前每次失眠我都是苦等睡意重來宫静,這次我微微一笑,拿起手機(jī)直接面對券时。 按...
    訴舊閱讀 357評論 0 0
  • 《 母親 》 ……雪山飛狐 借著夜色 我讀懂了母親 那含辛茹苦的雙手 是您用責(zé)任和使命 召喚日月 為我換來的春夏秋...
    水木年華qi閱讀 417評論 0 1
  • 有個朋友問我孤里,你覺得孤單嗎?我不覺得孤單橘洞,是孤獨(dú)捌袜,一種更深層次的孤單。我會一個人吃飯逛街看電影炸枣,以及出遠(yuǎn)門虏等。倒也覺...
    你看我的眼閱讀 137評論 0 0