c/s架構簡單介紹


c/s架構即客戶端/服務端架構(想廣義點)
學習socket(套接字)是為了c/s架構服務的,而這之前要學ois七層(相當於全世界人想通訊必須規定用英語http://www.cnblogs.com/linhaifeng/articles/5937962.html)

簡單理解一下ois七層(也就是一種協議,世界上所有計算機中的不同應用程序之間的一種通用交流語言):
物理層,數據鏈路層,網絡層,傳輸層,(會話層,表示層,應用層)
舉個例子,首先物理層很好理解,是通信的介質(電纜,線路,無線等等)
假設將網絡通訊比作不同教室之間人的通訊,原始的人與人之間用吼(即廣播),只要知道每個人名字(MAC地址)吼一聲就可以。
計算機A與計算機B通訊,計算機A產生一串0101,沒有任何意義,數據鏈路層將它們分組,附上MAC地址,吼!!!原則上,如果世界上所有計算機在一個教室中,到這一層,問題解決。
可是實際不可能這樣,沒這么大的教室,它們在不同的教室中。所以如果A,B不在同一個教室,首先還得知道它們所在的教室號,這時候網絡層誕生,IP地址(協議)出現。
有了這兩個,A,B通訊沒問題了。可是我想要的是計算機A上的QQ與計算機B上面的QQ通訊,而不是與暴風什么的。所以還得鎖定電腦上的不同程序,而每個程序與端口綁定,基於端口有TCP/UDP協議。
(因為IP是綁定在網卡上(mac)的,所以有時候說ip標識一台計算機是隱含了這層意思)
而每次這樣通訊也太麻煩了,所以有人將TCP/IP協議封裝,也就是將應用層(廣義)以下封裝,留幾個接口調用,這樣產生了socket協議。說白了基於socket協議也就是基於IOS協議

因此,客戶端是一個程序,服務端是一個程序,兩種通訊是要基於IOS協議,這里相當於簡化,基於SOCKET(其實套接字有基於網絡的,還有基於文件的,這里相當於基於網絡的)



下面是一套簡陋的客戶端與服務端:
socket客戶端:
 1 import socket
 2 
 3 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 4 
 5 phone.connect(('127.0.0.1',8000))     # 撥電話 , IP只能綁定自己電腦上的IP
 6 
 7 # 必須二進制發收,不能直接發字符串
 8 phone.send('hello'.encode('utf-8'))    # 假設發一個hello
 9 data = phone.recv(1024)  # 接收服務器發來的消息
10 print('收到服務器的消息是: ',data)
View Code
 
        

這張圖片幫助簡單理解,下面是服務端:

 1 import socket
 2 
 3 '''
 4 這段代碼其實就是實現TCP的三次握手,數據通訊(每次發送都有ack回應,所以說是嚴密的),四次揮手
 5 '''
 6 
 7 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # AF_INET是基於網絡的意思
 8 phone.bind(('127.0.0.1',8000))  # IP+端口,這里的IP地址必須是自己電腦的IP
 9 phone.listen(5)    # 對多等多少個電話,相當於緩存大小
10 
11 print('---------------------------下面accept等待')
12 
13 conn, addr = phone.accept()         # 等電話,一旦有電話拿到電話連接與對方手機號,TCP背后做三次握手
14 
15 # 注意通訊是基於網絡,也就是二進制通訊
16 msg = conn.recv(1024)           #收對方消息,1024代表收對方多少量消息
17 print('客戶端發來的消息是: ',msg)
18 
19 
20 conn.send(msg.upper())                 # 發消息
21 
22 conn.close()
23 phone.close()
View Code

 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM