python3+socket搭建簡易服務器

踩了一上午的坑以後,終於對網絡編程有了一點大體的、基本的瞭解。真的是0基礎,以前對socket網絡編程一點都不知道。(感受本身與時代脫軌。。。。)html

首先我想對這些美妙的專業術語進行一番搜索:python

服務器:簡而言之,它是一個位於一個物理服務器上的網絡服務器(呀,服務器上的服務器),它等待客戶端發送請求。當它接收到一個請求,就會生成一個響應並回發給客戶端。客戶端和服務器使用HTTP協議通訊。客戶端能夠是瀏覽器或者別的使用HTTP協議的軟件。-----------------------伯樂在線程序員

 套接字:TCP用主機的IP地址加上主機上的端口號做爲TCP鏈接的端點,這種端點就叫作套接字(socket)或插口。套接字用(IP地址:端口號)。-------------------------百度web

表示若是把服務器和客戶端比做一對情侶的話,那麼套接字就是他們相互擁抱的雙手。編程

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等等。---------------------------------http://www.cnblogs.com/shangdahao/archive/2013/05/22/3085131.html?share_from=com.rae.cnblogs網絡

利用Socket創建網絡鏈接的步驟:
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()

 

運行效果:

這是服務器的打印結果。

客戶端:

相關文章
相關標籤/搜索