摘要:我們來編寫一個簡單的服務器程序,它接收客戶端連接,回復客戶端發來的請求。如果一切順利,新浪的服務器接受了我們的連接,一個連接就建立起來的,后面的通信就是發送網頁內容了。
TCP
TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議,由IETF的RFC 793定義。在簡化的計算機網絡OSI模型中,它完成第四層傳輸層所指定的功能,用戶數據報協議(UDP)是同一層內 [1] 另一個重要的傳輸協議。在因特網協議族(Internet protocol suite)中,TCP層是位于IP層之上,應用層之下的中間層。不同主機的應用層之間經常需要可靠的、像管道一樣的連接,但是IP層不提供這樣的流機制,而是提供不可靠的包交換。
下面是socket實現TCP通信的示意圖,我們根據示意圖來編寫程序
服務器進程首先要綁定一個端口并監聽來自其他客戶端的連接。 如果某個客戶端連接過來了, 服務器就與該客戶端建立Socket連接, 隨后的通信就靠這個Socket連接了。
我們來編寫一個簡單的服務器程序, 它接收客戶端連接,回復客戶端發來的請求。
import socket server = socket.socket() server.bind(("192.168.1.165",8900)) #調用 listen() 方法開始監聽端口, 傳入的參數指定等待連接的最大數量 server.listen(4) serObj,address = server.accept() #當有客戶端訪問時,實現兩邊的交流,如果有一方退出,整個程序退出。 #服務器程序通過一個永久循環來接受來自客戶端的連接 #這里雖然給出最大連接數為4,但單線程程序也只會響應一個連接 while True: #建立連接后,服務端等待客戶端發送的數據,實現通信 re_data = serObj.recv(1024).decode("utf-8") print("client>>",re_data) if re_data == "quit": break send_data = input("server>>") serObj.send(send_data.encode("utf-8")) if send_data == "quit": break serObj.close() server.close()TCP客戶端
大多數連接都是可靠的TCP連接。 創建TCP連接時, 主動發起連接的叫客戶端, 被
動響應連接的叫服務器。
舉個例子, 當我們在瀏覽器中訪問新浪時, 我們自己的計算機就是客戶端, 瀏覽器會主動向新浪的服務器發起連接。 如果一切順利, 新浪的服務器接受了我們的連接, 一個TCP連接就建立起來的, 后面的通信就是發送網頁內容了。
客戶端要主動發起TCP連接, 必須知道服務器的IP地址和端口號。
import socket client = socket.socket() client.connect(("192.168.1.165",8900)) while True: send_data = input("client>>") client.send(send_data.encode("utf-8")) if send_data == "quit": break re_data = client.recv(1024).decode("utf-8") if re_data == "quit": break print("server>>",re_data) client.close()
用一個窗口運行客戶端、另一個窗口運行服務端,可以更直觀看見效果。
這里我的08_pra.py是服務端程序,09_pra.py是客戶端程序
剛建立連接時的示意圖
一次通信完成的示意圖
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42578.html
摘要:是建立可靠連接,并且通信雙方都可以以流的形式發送數據。相對,則是面向無連接的協議。測試結果用兩個命令行分別啟動服務器和客戶端測試開啟服務端完成一次通信 UDP TCP是建立可靠連接, 并且通信雙方都可以以流的形式發送數據。 相對TCP, UDP則是面向無連接的協議。使用UDP協議時, 不需要建立連接, 只需要知道對方的IP地址和端口號, 就可以直接發數據包。 但是, 能不能到達就不知道...
摘要:協程實現連接在網絡通信中,每個連接都必須創建新線程或進程來處理,否則,單線程在處理連接的過程中,無法接受其他客戶端的連接。所以我們嘗試使用協程來實現服務器對多個客戶端的響應。 協程實現TCP連接 在網絡通信中,每個連接都必須創建新線程(或進程) 來處理,否則,單線程在處理連接的過程中, 無法接受其他客戶端的連接。所以我們嘗試使用協程來實現服務器對多個客戶端的響應。與單一TCP通信的構架...
摘要:一個包來了之后,到底是交給瀏覽器還是,就需要端口號來區分。每個網絡程序都向操作系統申請唯一的端口號,這樣,兩個進程在兩臺計算機之間建立網絡連接就需要各自的地址和各自的端口號。 網絡通信的三要素 IP 通信的時候, 雙方必須知道對方的標識, 好比發郵件必須知道對方的郵件地址。 互聯網上每個計算機的唯一標識就是IP地址, 類似 123.123.123.123 。 IP地址實際上是一個32位...
摘要:在一個進程內部,要同時干多件事,就需要同時運行多個子任務,我們把進程內的這些子任務稱為線程。總結一下,多任務的實現方式有三種多進程模式多線程模式多進程多線程模式線程是最小的執行單元,而進程由至少一個線程組成。 進程與線程 很多同學都聽說過,現代操作系統比如Mac OS X,UNIX,Linux,Windows等,都是支持多任務的操作系統。 什么叫多任務呢?簡單地說,就是操作系統可以同時...
摘要:分布式進程在和中,應當優選,因為更穩定,而且,可以分布到多臺機器上,而最多只能分布到同一臺機器的多個上。由于模塊封裝很好,不必了解網絡通信的細節,就可以很容易地編寫分布式多進程程序。 分布式進程 在Thread和Process中,應當優選Process,因為Process更穩定,而且,Process可以分布到多臺機器上,而Thread最多只能分布到同一臺機器的多個CPU上。 Pytho...
閱讀 1683·2021-10-13 09:39
閱讀 3154·2021-10-12 10:11
閱讀 549·2021-09-28 09:36
閱讀 2633·2019-08-30 15:55
閱讀 1384·2019-08-30 13:04
閱讀 621·2019-08-29 17:08
閱讀 1900·2019-08-29 14:14
閱讀 3399·2019-08-28 18:23