欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python 簡(jiǎn)單的socket編程(TCP)

系統(tǒng) 2049 0
  • 問(wèn)題描述

個(gè)人認(rèn)為,Socket編程是一個(gè)很重要的東西,無(wú)論是什么語(yǔ)言,用到Socket編程的一定有很多,所以,學(xué)習(xí)Socket編程是很重要的。個(gè)人學(xué)習(xí)Socket編程的原因,是因?yàn)樽约河X(jué)得學(xué)Python有一段時(shí)間了,想要做個(gè)桌面應(yīng)用程序出來(lái),首先要搞定Socket編程,所以就開(kāi)始學(xué)習(xí)了。下面介紹一下簡(jiǎn)單的Socket編程。

?

  • 解決方法

直接上代碼,分為兩個(gè)程序,一個(gè)是服務(wù)端的程序,用于接收其他的tcp連接,另一個(gè)是客戶(hù)端的程序,用于請(qǐng)求連接。

首先,是服務(wù)端的程序:

            
              import socket

HOST = '0.0.0.0'  
PORT = 8000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    while True:
        conn, addr = s.accept()
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)
            print('get data ', data.decode('utf-8'))

            
          

這里host寫(xiě)的是0.0.0.0,指的是允許所有的IP進(jìn)行tcp連接,如果設(shè)置為127.0.0.1,則就是本機(jī)訪問(wèn),除了服務(wù)器程序運(yùn)行以外的機(jī)器無(wú)法進(jìn)行訪問(wèn)。

port就是指端口,指定tcp通過(guò)哪個(gè)端口進(jìn)行連接

接下來(lái)就是生成socket對(duì)象,這里需要說(shuō)明的是,有的程序生成socket對(duì)象使用的是?

            
              sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            
          

這個(gè)和上面代碼中的?

            
              with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            
          

?效果是一樣的,問(wèn)題在于,使用第一個(gè)代碼時(shí),我們進(jìn)行完連接以后,需要手動(dòng)的進(jìn)行close。

            
              sock.close()
            
          

?而如果使用with語(yǔ)句,那么我們就不需要自己手動(dòng)設(shè)置close,程序能夠幫助我們自動(dòng)關(guān)閉,如果你能理解文件操作里面的open 和 with open,那么我相信你也能理解這里with的意思。

socket.AF_INET 指通過(guò)ipv4連接,socket.SOCK_STREAM 指通過(guò)tcp連接

s.bind 指將套接字綁定到我們之前指定的地址

s.listen 指開(kāi)始進(jìn)行監(jiān)聽(tīng)tcp連接

接下來(lái)進(jìn)行死循環(huán)

conn, addr = s.accept()? ? ? ?接受TCP鏈接并返回(conn, address),其中conn是新的套接字對(duì)象,可以用來(lái)接收和發(fā)送數(shù)據(jù),address是連接客戶(hù)端的地址。

接下來(lái)再次進(jìn)行死循環(huán),上一次的死循環(huán),能夠讓我們建立連接以后,發(fā)送多次消息,而這一次的死循環(huán),是循環(huán)接收數(shù)據(jù),因?yàn)槲覀兘邮諗?shù)據(jù)是

            
              data = conn.recv(1024)
            
          

即接收1024字節(jié),所以,如果我們發(fā)送的字節(jié)超過(guò)了1024字節(jié),那么我們就進(jìn)行下一次循環(huán),繼續(xù)接收1024字節(jié),就一直死循環(huán),直到所有的字節(jié)接受完,然后就 break 退出

conn.sendall(data) 指返回?cái)?shù)據(jù)給客戶(hù)端,sendall指一次性發(fā)送所有的數(shù)據(jù),因?yàn)槿绻覀円l(fā)送的數(shù)據(jù)超過(guò)了1024字節(jié),用send方法發(fā)送數(shù)據(jù)的話(huà),一次性是發(fā)送不完的,是需要用死循環(huán)進(jìn)行發(fā)送的, 但是如果我們用sendall,就不用死循環(huán)發(fā)送了。需要注意的是,我們收到或者發(fā)送的數(shù)據(jù)是bytes格式的,所以我們?cè)诎l(fā)送數(shù)據(jù)時(shí),需要用encode,將接收的數(shù)據(jù)變成字符串時(shí),我們需要用decode。

?

接下來(lái)是客戶(hù)端程序

            
              import socket

HOST = '192.168.5.135'  # 服務(wù)器的主機(jī)名或者 IP 地址
PORT = 8000        # 服務(wù)器使用的端口

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.settimeout(5)
    while True:
        try:
            a = input('please input:')
            s.sendall(a.encode('utf-8'))
            data = s.recv(1024)
            print('Received', data.decode('utf-8'))
        except socket.timeout as e:
            print('time out')
            continue
            
          

?host指服務(wù)器ip

port指服務(wù)器端口

使用with 語(yǔ)句創(chuàng)建socket對(duì)象

s.connect進(jìn)行tcp連接

s.settimeout(5)設(shè)置超時(shí)時(shí)間,如果一段5秒以后沒(méi)有還是沒(méi)有和服務(wù)器進(jìn)行正常的通信,那么,就拋出socket.timeout異常

接下來(lái)進(jìn)行死循環(huán),我們使用input發(fā)送我們想發(fā)送的字符串

然后使用sendall進(jìn)行發(fā)送,發(fā)送之前使用encode將字符串轉(zhuǎn)為bytes格式

接下來(lái)進(jìn)行recv,接收服務(wù)器返回來(lái)的數(shù)據(jù)

打印輸入服務(wù)器數(shù)據(jù)

如果我們捕獲了socket.timeout異常,則進(jìn)行下一次的數(shù)據(jù)發(fā)送

下圖為客戶(hù)端程序輸出:

下圖為服務(wù)端程序輸出:

至此,簡(jiǎn)單的tcp程序就完成了

?

  • 總結(jié)

有了上面的程序,再進(jìn)行一點(diǎn)異常的捕獲、優(yōu)化,我們就能夠進(jìn)行相對(duì)穩(wěn)定的tcp連接了, 如果后面有碰到多連接的情況,再進(jìn)行處理。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 伊人影院综合 | 91视频官网| 亚洲成人精品 | 91免费国产在线观看 | 日韩一二 | 国产精品视频免费观看 | jav中文字幕| 久久一本日韩精品中文字幕屁孩 | 欧美精品38videos性欧美 | 成人免费无毒在线观看网站 | 国产日产精品一区二区三区四区 | 一级特黄视频 | 国产精品2020观看久久 | 男人电影天堂 | 国产精品久久久久国产A级 首页亚洲国产丝袜长腿综合 | 欧美精品在线一区 | 91高清在线| 999jjj在线播放 | 午夜资源网| 久久在线免费视频 | 国产精品综合视频 | 国产综合一区二区 | 五月婷婷社区 | 双凤奇案 | 黄色片快播 | 乳罩双性受给攻喂奶高h | 久久综合欧美 | 国内精品免费视频 | 欧美精品中文字幕久久二区 | 一区二区三区回区在观看免费视频 | 狠狠色狠色综合曰曰 | 精品欧美一区二区三区久久久 | 日韩av一区二区三区在线 | 国产精品久久久久免费视频 | 国产成人精品视频 | 日韩高清一区二区 | 日韩在线观看你懂的 | 国产精品久久久久久久 | 国产精品久久久久无毒 | 国产成人小视频 | 亚洲综合久久久久久888 |