踩了一上午的坑以後,終於對網絡編程有了一點大體的、基本的瞭解。真的是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()
運行效果:
這是服務器的打印結果。
客戶端: