成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

python大佬養(yǎng)成計(jì)劃----socket實(shí)現(xiàn)TCP通信

layman / 2740人閱讀

摘要:我們來(lái)編寫(xiě)一個(gè)簡(jiǎn)單的服務(wù)器程序,它接收客戶(hù)端連接,回復(fù)客戶(hù)端發(fā)來(lái)的請(qǐng)求。如果一切順利,新浪的服務(wù)器接受了我們的連接,一個(gè)連接就建立起來(lái)的,后面的通信就是發(fā)送網(wǎng)頁(yè)內(nèi)容了。

TCP

TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,由IETF的RFC 793定義。在簡(jiǎn)化的計(jì)算機(jī)網(wǎng)絡(luò)OSI模型中,它完成第四層傳輸層所指定的功能,用戶(hù)數(shù)據(jù)報(bào)協(xié)議(UDP)是同一層內(nèi) [1] 另一個(gè)重要的傳輸協(xié)議。在因特網(wǎng)協(xié)議族(Internet protocol suite)中,TCP層是位于IP層之上,應(yīng)用層之下的中間層。不同主機(jī)的應(yīng)用層之間經(jīng)常需要可靠的、像管道一樣的連接,但是IP層不提供這樣的流機(jī)制,而是提供不可靠的包交換。

下面是socket實(shí)現(xiàn)TCP通信的示意圖,我們根據(jù)示意圖來(lái)編寫(xiě)程序

TCP服務(wù)端

服務(wù)器進(jìn)程首先要綁定一個(gè)端口并監(jiān)聽(tīng)來(lái)自其他客戶(hù)端的連接。 如果某個(gè)客戶(hù)端連接過(guò)來(lái)了, 服務(wù)器就與該客戶(hù)端建立Socket連接, 隨后的通信就靠這個(gè)Socket連接了。

我們來(lái)編寫(xiě)一個(gè)簡(jiǎn)單的服務(wù)器程序, 它接收客戶(hù)端連接,回復(fù)客戶(hù)端發(fā)來(lái)的請(qǐng)求。

import socket
server = socket.socket()
server.bind(("192.168.1.165",8900))
#調(diào)用 listen() 方法開(kāi)始監(jiān)聽(tīng)端口, 傳入的參數(shù)指定等待連接的最大數(shù)量
server.listen(4)
serObj,address = server.accept()
#當(dāng)有客戶(hù)端訪問(wèn)時(shí),實(shí)現(xiàn)兩邊的交流,如果有一方退出,整個(gè)程序退出。
#服務(wù)器程序通過(guò)一個(gè)永久循環(huán)來(lái)接受來(lái)自客戶(hù)端的連接
#這里雖然給出最大連接數(shù)為4,但單線程程序也只會(huì)響應(yīng)一個(gè)連接
while True:
#建立連接后,服務(wù)端等待客戶(hù)端發(fā)送的數(shù)據(jù),實(shí)現(xiàn)通信
    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客戶(hù)端

大多數(shù)連接都是可靠的TCP連接。 創(chuàng)建TCP連接時(shí), 主動(dòng)發(fā)起連接的叫客戶(hù)端, 被
動(dòng)響應(yīng)連接的叫服務(wù)器。

舉個(gè)例子, 當(dāng)我們?cè)跒g覽器中訪問(wèn)新浪時(shí), 我們自己的計(jì)算機(jī)就是客戶(hù)端, 瀏覽器會(huì)主動(dòng)向新浪的服務(wù)器發(fā)起連接。 如果一切順利, 新浪的服務(wù)器接受了我們的連接, 一個(gè)TCP連接就建立起來(lái)的, 后面的通信就是發(fā)送網(wǎng)頁(yè)內(nèi)容了。

客戶(hù)端要主動(dòng)發(fā)起TCP連接, 必須知道服務(wù)器的IP地址和端口號(hào)。

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

用一個(gè)窗口運(yùn)行客戶(hù)端、另一個(gè)窗口運(yùn)行服務(wù)端,可以更直觀看見(jiàn)效果。
這里我的08_pra.py是服務(wù)端程序,09_pra.py是客戶(hù)端程序

剛建立連接時(shí)的示意圖

一次通信完成的示意圖

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42578.html

相關(guān)文章

  • python大佬養(yǎng)成計(jì)劃----socket實(shí)現(xiàn)UDP通信

    摘要:是建立可靠連接,并且通信雙方都可以以流的形式發(fā)送數(shù)據(jù)。相對(duì),則是面向無(wú)連接的協(xié)議。測(cè)試結(jié)果用兩個(gè)命令行分別啟動(dòng)服務(wù)器和客戶(hù)端測(cè)試開(kāi)啟服務(wù)端完成一次通信 UDP TCP是建立可靠連接, 并且通信雙方都可以以流的形式發(fā)送數(shù)據(jù)。 相對(duì)TCP, UDP則是面向無(wú)連接的協(xié)議。使用UDP協(xié)議時(shí), 不需要建立連接, 只需要知道對(duì)方的IP地址和端口號(hào), 就可以直接發(fā)數(shù)據(jù)包。 但是, 能不能到達(dá)就不知道...

    Juven 評(píng)論0 收藏0
  • python大佬養(yǎng)成計(jì)劃--協(xié)程實(shí)現(xiàn)TCP連接

    摘要:協(xié)程實(shí)現(xiàn)連接在網(wǎng)絡(luò)通信中,每個(gè)連接都必須創(chuàng)建新線程或進(jìn)程來(lái)處理,否則,單線程在處理連接的過(guò)程中,無(wú)法接受其他客戶(hù)端的連接。所以我們嘗試使用協(xié)程來(lái)實(shí)現(xiàn)服務(wù)器對(duì)多個(gè)客戶(hù)端的響應(yīng)。 協(xié)程實(shí)現(xiàn)TCP連接 在網(wǎng)絡(luò)通信中,每個(gè)連接都必須創(chuàng)建新線程(或進(jìn)程) 來(lái)處理,否則,單線程在處理連接的過(guò)程中, 無(wú)法接受其他客戶(hù)端的連接。所以我們嘗試使用協(xié)程來(lái)實(shí)現(xiàn)服務(wù)器對(duì)多個(gè)客戶(hù)端的響應(yīng)。與單一TCP通信的構(gòu)架...

    fuchenxuan 評(píng)論0 收藏0
  • python大佬養(yǎng)成計(jì)劃----socket網(wǎng)絡(luò)編程

    摘要:一個(gè)包來(lái)了之后,到底是交給瀏覽器還是,就需要端口號(hào)來(lái)區(qū)分。每個(gè)網(wǎng)絡(luò)程序都向操作系統(tǒng)申請(qǐng)唯一的端口號(hào),這樣,兩個(gè)進(jìn)程在兩臺(tái)計(jì)算機(jī)之間建立網(wǎng)絡(luò)連接就需要各自的地址和各自的端口號(hào)。 網(wǎng)絡(luò)通信的三要素 IP 通信的時(shí)候, 雙方必須知道對(duì)方的標(biāo)識(shí), 好比發(fā)郵件必須知道對(duì)方的郵件地址。 互聯(lián)網(wǎng)上每個(gè)計(jì)算機(jī)的唯一標(biāo)識(shí)就是IP地址, 類(lèi)似 123.123.123.123 。 IP地址實(shí)際上是一個(gè)32位...

    phodal 評(píng)論0 收藏0
  • python大佬養(yǎng)成計(jì)劃----進(jìn)程、線程與多進(jìn)程

    摘要:在一個(gè)進(jìn)程內(nèi)部,要同時(shí)干多件事,就需要同時(shí)運(yùn)行多個(gè)子任務(wù),我們把進(jìn)程內(nèi)的這些子任務(wù)稱(chēng)為線程。總結(jié)一下,多任務(wù)的實(shí)現(xiàn)方式有三種多進(jìn)程模式多線程模式多進(jìn)程多線程模式線程是最小的執(zhí)行單元,而進(jìn)程由至少一個(gè)線程組成。 進(jìn)程與線程 很多同學(xué)都聽(tīng)說(shuō)過(guò),現(xiàn)代操作系統(tǒng)比如Mac OS X,UNIX,Linux,Windows等,都是支持多任務(wù)的操作系統(tǒng)。 什么叫多任務(wù)呢?簡(jiǎn)單地說(shuō),就是操作系統(tǒng)可以同時(shí)...

    taowen 評(píng)論0 收藏0
  • python大佬養(yǎng)成計(jì)劃----分布式進(jìn)程

    摘要:分布式進(jìn)程在和中,應(yīng)當(dāng)優(yōu)選,因?yàn)楦€(wěn)定,而且,可以分布到多臺(tái)機(jī)器上,而最多只能分布到同一臺(tái)機(jī)器的多個(gè)上。由于模塊封裝很好,不必了解網(wǎng)絡(luò)通信的細(xì)節(jié),就可以很容易地編寫(xiě)分布式多進(jìn)程程序。 分布式進(jìn)程 在Thread和Process中,應(yīng)當(dāng)優(yōu)選Process,因?yàn)镻rocess更穩(wěn)定,而且,Process可以分布到多臺(tái)機(jī)器上,而Thread最多只能分布到同一臺(tái)機(jī)器的多個(gè)CPU上。 Pytho...

    honmaple 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<