1. 程式人生 > >【工作筆記】Socket、TCP到底是什麼,我可以用Python來做實驗嗎?

【工作筆記】Socket、TCP到底是什麼,我可以用Python來做實驗嗎?

Socket

中文是套接字。這個翻譯總感覺誤人子弟,至少大一大二時的我就看不懂,直到現在才明白。其實Socket本質就是對網路傳輸行為的封裝,通過這個封裝我們可以無視網路層、鏈路層和傳輸層的是怎麼做的。 我只要告訴它,我要用到的協議型別是TCP還是UDP。 我猜測Socket是建立在傳輸層的。
這裡寫圖片描述
一直感覺這張圖是張神圖。網路知識的脈絡。

Python程式碼

先直接上程式碼看執行效果。python大法簡單快速的實現了網路的互動行為。

import socket
import thread
import time

# create socket object
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# set an port to listen
s.bind(("127.0.0.1", 9991)) # this is maximum num of listen queue s.listen(5) while True: print "wait connect...\n" # waiting for connect sock, address = s.accept() # accept one connect print "Accept one connection from %s:%s\n" %address while True: # receive message from client
data = sock.recv(1024) print "[client]:%s" %data

執行結果:
這裡寫圖片描述

接著開啟命令列準備和上面的埠連線:
這裡寫圖片描述

收到連線請求了,連線成功:
這裡寫圖片描述

分段來思考下程式碼

# create socket object
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# set an port to listen
s.bind(("127.0.0.1", 9991))

# this is maximum num of listen queue
s.listen
(5)

這三句話講白了就是建立一個套接字物件,其中“127.0.0.1”的地址是可以省略的。設定了程式在9991埠去監聽,監聽的佇列最大長度是5個。怎麼監聽的?監聽的行為是什麼樣的,這些都是作業系統給我們做好了的,我暫時思考不到。不過我想象了這樣一個場景,有個分守衛在9991埠守著,直到有連線請求到來,他會大喊,也就是接下來的程式碼。

while True:
    print "wait connect...\n"

    # waiting  for connect
    sock, address = s.accept()

    # accept one connect
    print "Accept one connection from %s:%s\n" %address

這時候程式會阻塞在 sock, address = s.accept() 這句話。通過斷點除錯也可以發現這裡是停止不前的。一直到守衛大喊“有人來了”。才繼續往下執行。

總結

我以前一直學不會網路,不是因為知識儲備不夠,我現在的知識儲備不比以前強多少。只是因為工作了,不學會就沒飯吃,可怕。所以我想告訴自己,遇到不懂的知識將其分解,遞迴的弄懂每個子知識,然後根知識就遊刃而解了。遞迴的過程很長,可能三天或是一週,但總比一直悔恨自己大學沒認真學習強。
這裡寫圖片描述