1、C/S B/S 架構
一、定義
(1)C/S結構,即Client/Server(客戶機/服務器)結構,是你們熟知的軟件系統體系結構,經過將任務合理分配到Client端和Server端,下降了系統的通信開銷,能夠充分利用兩端硬件環境的優點。早期的軟件系統多 以此做爲首選設計標準。
(2)B/S結構,即Browser/Server(瀏覽器/服務器)結構,是隨着Internet技術的興起,對C/S結構的一種變化或者改進的結構。在這種結構下,用戶界面徹底經過WWW瀏覽器實現,一部分事務邏輯在前端實現,可是 主要事務邏輯在服務器端實現,造成所謂3-tier結構。
B/S結構,主要是利用了不斷成熟的WWW瀏覽器技術,結合瀏覽器的多種scrīpt語言(VBscrīpt、Javascrīpt…)和ActiveX技術,用通用瀏覽器就實現了原來須要複雜專用軟件才能實現的強大功能,並節約了開發成 本,是一種全新的軟件系統構造技術。隨着Windows 98/Windows 2000將瀏覽器技術植入操做系統內部,這種結構更成爲當今應用軟件的首選體系結構。
二、區別
Client/Server是創建在局域網的基礎上的.Browser/Server是創建在廣域網的基礎上的.
(1).硬件環境不一樣
C/S 通常創建在專用的網絡上, 小範圍裏的網絡環境, 局域網之間再經過專門服務器提供鏈接和數據交換服務.
B/S 創建在廣域網之上的, 沒必要是專門的網絡硬件環境,例如電話上網, 租用設備. 信息管理. 有比C/S更強的適應範圍, 通常只要有操做系統和瀏覽器就行
(2).對安全要求不一樣
C/S 通常面向相對固定的用戶羣, 對信息安全的控制能力很強. 通常高度機密的信息系統採用C/S 結構適宜. 能夠經過B/S發佈部分可公開信息.
B/S 創建在廣域網之上, 對安全的控制能力相對弱, 面向是不可知的用戶羣.
(3).對程序架構不一樣
C/S 程序能夠更加註重流程, 能夠對權限多層次校驗, 對系統運行速度能夠較少考慮.
B/S 對安全以及訪問速度的多重的考慮, 創建在須要更加優化的基礎之上. 比C/S有更高的要求 B/S結構的程序架構是發展的趨勢, 從MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持網絡的構件搭建的系統. SUN 和IBM推的JavaBean 構件技術等,使 B/S更加成熟.
(4).軟件重用不一樣
C/S 程序能夠不可避免的總體性考慮, 構件的重用性不如在B/S要求下的構件的重用性好.
B/S 對的多重結構,要求構件相對獨立的功能. 可以相對較好的重用.
(5).系統維護不一樣
系統維護在是軟件生存週期中,開銷大, -------重要
C/S 程序因爲總體性, 必須總體考察, 處理出現的問題以及系統升級. 升級難. 多是再作一個全新的系統
B/S 構件組成,方面構件個別的更換,實現系統的無縫升級. 系統維護開銷減到最小.用戶從網上本身下載安裝就能夠實現升級.
(6).處理問題不一樣
C/S 程序能夠處理用戶面固定, 而且在相同區域, 安全要求高需求, 與操做系統相關. 應該都是相同的系統
B/S 創建在廣域網上, 面向不一樣的用戶羣, 分散地域, 這是C/S沒法做到的. 與操做系統平臺關係最小.
(7).用戶接口不一樣
C/S 可能是創建的Window平臺上,表現方法有限,對程序員廣泛要求較高
B/S 創建在瀏覽器上, 有更加豐富和生動的表現方式與用戶交流. 而且大部分難度減低,減低開發成本.
2、socket
一、圖
二、socket定義
Socket是應用層與TCP/IP協議族通訊的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來講,一組簡單的接口就是所有,讓Socket去組織數據,以符合指定的協議。
socket就是一個模塊。咱們經過調用模塊中已經實現的方法創建兩個進程之間的鏈接和通訊。也有人將socket說成ip+port,由於ip是用來標識互聯網中的一臺主機的位置,而port是用來標識這臺機器上的一個應用程序。因此咱們只要確立了ip和port就能找到一個應用程序,而且使用socket模塊來與之通訊
三、socket發展史
套接字起源於 20 世紀 70 年代加利福尼亞大學伯克利分校版本的 Unix,即人們所說的 BSD Unix。 所以,有時人們也把套接字稱爲「伯克利套接字」或「BSD 套接字」。一開始,套接字被設計用在同 一臺主機上多個應用程序之間的通信。這也被稱進程間通信,或 IPC。套接字有兩種(或者稱爲有兩個種族),分別是基於文件型的和基於網絡型的
(1)基於文件類型的套接字家族 - AF_UNIX
unix一切皆文件,基於文件的套接字調用的就是底層的文件系統來取數據,兩個套接字進程運行在同一機器,能夠經過訪問同一個文件系統間接完成通訊
(2)基於網絡類型的套接字家族 - AF_INET
(還有AF_INET6被用於ipv6,還有一些其餘的地址家族,不過,他們要麼是隻用於某個平臺,要麼就是已經被廢棄,或者是不多被使用,或者是根本沒有實現,全部地址家族中,AF_INET是使用最普遍的一個,python支持不少種地址家族,可是因爲咱們只關心網絡編程,因此大部分時候我麼只使用AF_INET)
3、socket編程
一、服務端
1 import socket
2 sk = socket.socket()
3 sk.bind(('127.0.0.1',8898)) #把地址綁定到套接字
4 sk.listen() #監聽連接
5 conn,addr = sk.accept() #接受客戶端連接
6 ret = conn.recv(1024) #接收客戶端信息
7 print(ret) #打印客戶端信息
8 conn.send(b'hi') #向客戶端發送信息
9 conn.close() #關閉客戶端套接字
10 sk.close() #關閉服務器套接字(可選)
二、客戶端前端
1 import socket
2 sk = socket.socket() # 建立客戶套接字
3 sk.connect(('127.0.0.1',8898)) # 嘗試鏈接服務器
4 sk.send(b'hello!')
5 ret = sk.recv(1024) # 對話(發送/接收)
6 print(ret)
7 sk.close() # 關閉客戶套接字
重啓服務端是會出現:OSError:[Errno 48] Address already in use, 解決方案python
1 #加入一條socket配置,重用ip和端口
2 import socket
3 from socket import SOL_SOCKET,SO_REUSEADDR
4 sk = socket.socket()
5 sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
6 sk.bind(('127.0.0.1',8898)) #把地址綁定到套接字
7 sk.listen() #監聽連接
8 conn,addr = sk.accept() #接受客戶端連接
9 ret = conn.recv(1024) #接收客戶端信息
10 print(ret) #打印客戶端信息
11 conn.send(b'hi') #向客戶端發送信息
12 conn.close() #關閉客戶端套接字
13 sk.close() #關閉服務器套接字(可選)
4、socket實例
一、一直輸入對話
服務端
1 import socket
2 from socket import SOL_SOCKET,SO_REUSEADDR
3 while 1:
4 server = socket.socket() # 建立服務器對象
5 server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
6 ip_port = ('192.168.15.202',8001) # 設置服務器段ip port
7 server.bind(ip_port) # 綁定ip port
8 server.listen(3) # 監聽ip,端口,看看監聽誰來訪問我;參數是設置容許最多10個客戶端來訪問我。源碼默認128一分組,不限制
9 print('等待鏈接...')
10 conn, address = server.accept() # 阻塞在這裏,等待客戶端的連接 , conn 是服務器與客戶端的連接通道,後面接收/發送都須要使用此變量
11 print('鏈接成功!')
12
13 while 1 :
14
15 from_client_msg = conn.recv(1024) # 接收客戶端的消息,設置接收數據大小,單位是字節
16 print(from_client_msg.decode('utf-8')) # 接收的是bytes類型的,須要解碼
17 if from_client_msg.decode('utf-8') == 'close':
18 break
19 msg = input('請返回數據>>>')
20 conn.send(msg.encode('utf-8')) # 向客戶端發送消息bytes類型,需編碼
客戶端程序員
1 import socket
2 client = socket.socket()
3 from_server_port = ('192.168.15.202',8001) # 設置須要訪問的服務器端ip port
4
5 client.connect(from_server_port) # 去連接服務器端ip port
6 while 1:
7 msg = input('>>>')
8 client.send(msg.encode('utf-8')) # 向服務器端發送信息,需編碼
9 if msg == 'close':
10 break
11 content_server = client.recv(1024) # 接收服務器發過來的消息
12 print(content_server.decode('utf-8')) # 將接收的消息進行解碼
13 client.close()