Python線程式“對講機”:socket網絡編程、線程
先看一下程序的運行效果:
一、什麼是socket?
socket
是用於在兩個基於TCP/IP
協議的應用程序之間相互復通信。我們平時用的QQ,微信,等社交軟件,基本都與socket
編程有關。
上圖是我們平時訪問瀏覽器時的流程圖,但引入本文的,就是服務器
與客戶端
之間的愛情瓜葛,而socket編程這個月老就是實現這倆人的交流。
1、在看這倆人甜蜜時,我們要學習幾個概念
本段摘自:【socket筆記】TCP、UDP通信總結
IP地址(InternetProtocolAddress)
:是指互聯網協議地址,又譯爲 網際協議地址。IP地址被用來給Internet上的電腦一個編號。我們可以把“個人電腦”比作“一臺電話”,那麼“IP地址”就相當於“電話號碼”。若計算機1知道計算機2的IP地址,則計算機1就能訪問計算機2。端口
:端口使用16bit進行編號,即其範圍爲: 0-65536。但 0-1024 的端口一般由系統分配給計算機特定的服務接口。協議(Protocol)
:是通信雙方進行數據交互的一種約定。協議族
:是多個協議的統稱。比如我們的TCP/IP協議族,其不僅僅是TCP協議、IP協議,而是多個協議的集合,其包含IP、TCP、UDP、FTP、SMTP等協議。
2、TCP協議
TCP(Transmission Control Protocol 傳輸控制協議)
:是一種面向連接的、可靠的、基於字節流的傳輸層通信協議,數據可以準確發送,數據丟失會重發。
- TCP通信的特點:TCP的三次與四次對話
連接:
客戶端:服務器!我來造作了 服務器:客戶端!我給你開門 客戶端:服務器!謝謝
斷開:
客戶端:服務器!我要走了 服務器:客戶端!我去給你開門 服務器:客戶端!門開好了,可以滾了 客戶端:服務器!誒,好嘞,你等的
再他們互相叫名的過程中,其實就是一個互相確定傳輸的過程:
在連接時TCP有如下過程:
在斷開時有如下過程:
3、UDP協議
UDP(User Datagram Protocol, 用戶數據報協議)
:是一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務,可以保證通訊效率,傳輸延時小。例如視頻聊天應用中用的就是UDP協議,這樣可以保證及時丟失少量數據,視頻的顯示也不受很大影響。
二、socket編程
1、服務器端
- 將接受功能單獨放入一個線程,讓此線程單獨運作,不讓他阻塞發送。
- 代碼:
import socket
import threading
import sys
def server_lunch():
HostPort = ('127.0.0.1', 9999)#設定主機名,端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#參數
s.bind(HostPort)#綁定IP接口
s.listen(20)#開始監聽
conn, addr = s.accept()#開始握手
print('Connecting by : ', addr)#顯示鏈接的administered
welcome = "···weclome to -LEAGUES OF SOPHON-···"
conn.send(welcome.encode('utf8'))#至上歡迎辭
return conn
def receive(conn):#接收函數
while True:
msg = conn.recv(1024).decode('utf8')#接收信息流,並轉化編碼
print("clience says:",msg)
if msg == "exit":
sys.exit()#退出程序
if __name__ == '__main__':
conn = server_lunch()#啓動服務端
server_trd = threading.Thread(target=receive , args=(conn,))#開啓線程
server_trd.start()
while True:#循環輸入
root = input(">>>").strip()
conn.send(root.encode('utf8'))
if root == "exit":
s.close()
2、同理的客服端
import socket
import threading
import sys
def receive(s):#接收函數
while True:
msg = s.recv(1024).decode('utf8')
if msg == "exit":
sys.exit()
print ("server says:", msg)
if __name__ == '__main__':
hostport = ('127.0.0.1', 9999)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(hostport)#連接接口
print(s.recv(1024).decode())
clience_trd = threading.Thread(target=receive,args=(s,))#啓動接收線程
clience_trd.start()
while True:
user_input = input('>>> ').strip()
s.send(user_input.encode('utf-8'))
if user_input == 'quit':
sys.exit()
運行結果:
實在是有趣。
推薦大家閱讀一下這兩篇文章。Python 網絡編程入門——用 Socket 做一個風花雪月服務器,Python 進階必備:線程模塊 threading
往後可能去開發一個原始版的QQ,以作爲網絡編程學習的大作業,親情期待。