踩了一上午的坑之後,終於對網路程式設計有了一點大致的、基本的了解。真的是0基礎,之前對socket網路程式設計一點都不知道。(感覺自己與時代脫軌。。。。)
首先我想對這些美妙的專業術語進行一番搜尋:
表示如果把伺服器和客戶端比作一對情侶的話,那麼套接字就是他們相互擁抱的雙手。
tcp?http?:http是高層協議,而tcp/ip是個協議集,包過許多的子協議。包括:傳輸層的 ftp,udp,tcp協議等,網路層的ip協議等,高層協議如http,telnet協議等,http是tcp/ip的乙個子協議。
tcp/ip :他是乙個協議棧,就像作業系統的執行機制一樣,必須要具體實現,同時還要提供對外的操作介面。這個就像作業系統會提供標準的程式設計介面,比如win32程式設計介面一樣,tcp/ip也要提供可供程式設計師做網路開發所用的介面,這就是socket程式設計介面。
socket:實際上socket是對tcp/ip協議的封裝,socket本身並不是協議,而是乙個呼叫介面(api),通過socket,我們才能使用tcp/ip協議。實際上,socket跟tcp/ip協議沒有必然的聯絡。socket程式設計介面在設計的時候,就希望也能適應其他的網路協議。所以說,socket的出現只是使得程式設計師更方便地使用tcp/ip協議棧而已,是對tcp/ip協議的抽象,從而形成了我們知道的一些最基本的函式介面,比如create、listen、connect、accept、send、read和write等等。---------------------------------
利用socket建立網路連線的步驟:
建立socket連線至少需要一對套接字,其中乙個執行於客戶端,稱為clientsocket ,另乙個執行於伺服器端,稱為serversocket 。
套接字之間的連線過程分為三個步驟:伺服器監聽,客戶端請求,連線確認。
1。伺服器監聽:伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連線的狀態,實時監控網路狀態,等待客戶端的連線請求。
2。客戶端請求:指客戶端的套接字提出連線請求,要連線的目標是伺服器端的套接字。為此,客戶端的套接字必須首先描述它要連線的伺服器的套接字,指出伺服器端套接字的位址和埠號,然後就向伺服器端套接字提出連線請求。
3。連線確認:當伺服器端套接字監聽到或者說接收到客戶端套接字的連線請求時,就響應客戶端套接字的請求,建立乙個新的執行緒,把伺服器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連線。而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連線請求。
(我是盜圖小能手)
好了,了解了一些可能會用到的術語,下面看看乙個用python搭建的簡易伺服器是長什麼樣的:
#其中 listen 函式會監聽連線到socket上的連線,引數表示在拒絕連線之前系統可以掛起的最大連線佇列數量為5。這些連線還沒有被accept處理。數量不能無限大,通常指定5。一旦我們監聽到了連線,就會呼叫 accept 函式接收連線 。coding: utf-8
"""搭建簡單伺服器
"""import
socket
host = '
10.130.167.108'#
獲取本地主機名,cmd下用ipconfig命令檢視
port = 12345 #
設定埠號
addr =(host,port) #放在一起就是套接字了
web = socket.socket() #
建立socket物件
web.bind(addr) #
繫結埠web.listen(5) #
等待客戶端連線,引數為tcp連線佇列的大小,就是連線數
print('
sever is listening...')
while
true:
client_connection,client_address = web.accept() #
建立客戶端連線
print('
link addr:')
print(client_address) #
列印客戶端發來的巢狀字
client_connection.send(str.encode(
"hello,world
")) #
向客戶端傳送資訊,需要byte型別的引數,需要做一下轉換
data = client_connection.recv(1024)
(data)
client_connection.close()
#關閉連線
accept 函式返回乙個二元組,client_connection 是乙個新的socket物件,用來接收和傳送資料。client_address 表示另一端的socket位址。
我們列印出客戶端的套接字後,緊接著向客戶端傳送資訊,這裡傳送的時候,注意一下我用的python3.6,裡面的字元編碼的格式問題。
傳送完資訊之後,我們等待接收客戶端傳送來的資訊並顯示。然後關閉連線,乙個迴圈結束。進入下乙個迴圈。
客戶端的程式:
"""執行效果:簡易客戶端
"""import
socket
host = '
10.130.167.108'#
獲取本地主機名
port = 12345 #
設定埠號
addr =(host,port)
web =socket.socket()
web.connect(addr)
#請求與伺服器建立連線
web.send(str.encode("
this is client...
")) #
向伺服器傳送資訊
data = web.recv(1024) #
接收資料
print(data) #
列印出接受到的資料
web.close()
這是伺服器的列印結果。
客戶端:
python3 socket 超時設定
針對鏈結 connect 時候的超時 法一 import socket socket.setdefaulttimeout 5 sock socket.socket socket.af inet,socket.sock stream sock.connect host,port sock.sendal...
sublime text3 搭建python環境
解壓,安裝。pythonsetup.py install setpython path c python27 c python27 scripts 指向實際python安裝路徑 重型的python ide推薦pycharm,輕型的sublime。這裡搭建sublime text3的python編譯環...
sublime text3搭建python除錯環境
1 安裝package control 方便安裝外掛程式包 2 使用package control安裝sublimecode intel autopep8 sublime repl 1 按下ctrl shift p挑出命令面板 2 輸入install package選項並回車,然後分別在列表中選中上...