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)
這張圖片幫助簡單理解,下面是服務端:

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()