python3 socket搭建簡易伺服器

2022-01-24 13:39:03 字數 3373 閱讀 7334

踩了一上午的坑之後,終於對網路程式設計有了一點大致的、基本的了解。真的是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搭建的簡易伺服器是長什麼樣的:

#

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)

print

(data)

client_connection.close()

#關閉連線

其中 listen 函式會監聽連線到socket上的連線,引數表示在拒絕連線之前系統可以掛起的最大連線佇列數量為5。這些連線還沒有被accept處理。數量不能無限大,通常指定5。一旦我們監聽到了連線,就會呼叫  accept 函式接收連線 。

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選項並回車,然後分別在列表中選中上...