小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

網(wǎng)絡(luò)編程

 印度阿三17 2020-12-11

#使用面向?qū)ο蠼鉀Qdatetime.tody()無法序列化的問題 import json from datetime import datetime,date # print(date.today()) #年月日 2020-12-08 # print(datetime.today()) #年月日時(shí)分秒 2020-12-08 16:07:34.919540 class Myjson (json.JSONEncoder): def default(self, o): if isinstance(o,datetime): return o.strftime('%Y-%m-%d %X') elif isinstance(o,date): return o.strftime('%Y-%m-%d') else: return super().default(self,o) res = {'c1':datetime.today(),'c2':date.today()} print(json.dumps(res,cls=Myjson))

網(wǎng)絡(luò)編程之 TCP

#學(xué)習(xí)網(wǎng)絡(luò)編程可以開發(fā)一個(gè)cs架構(gòu)的軟件
#學(xué)習(xí)并發(fā)、數(shù)據(jù)庫(kù)、前端、django可以開發(fā)bs架構(gòu)的軟件

#軟件開發(fā)架構(gòu)
C/S架構(gòu)(client/server)
    C:客戶端,APP
        S:服務(wù)端,架構(gòu)
    B/S架構(gòu)(browser/server)
    B:瀏覽器,taobao.com/jd.com
        S:服務(wù)端
    bs架構(gòu)實(shí)際上也是cs架構(gòu)
    統(tǒng)一接口:比如微信、支付寶
    
    #服務(wù)端
    24小時(shí)不間斷提供服務(wù)
    #客戶端
    什么時(shí)候想體驗(yàn)服務(wù),什么時(shí)候去找心儀的服務(wù)端尋求服務(wù)
        
#網(wǎng)絡(luò)編程發(fā)展史
任何先進(jìn)的技術(shù)基本上都是來源于軍事
    #回到過去
    1.早期的電話電話線
        2.大屁股電腦網(wǎng)線
        3.筆記本電腦,無線電話 網(wǎng)卡
        #要想實(shí)現(xiàn)遠(yuǎn)程通信,第一個(gè)需要具備的條件是:物理連接介質(zhì)
人想要實(shí)現(xiàn)交流必須統(tǒng)一語言 >>> 英文
        計(jì)算機(jī)想要與計(jì)算機(jī)遠(yuǎn)程通信,除了有物理連接介質(zhì)之外,還需要有一套公共的標(biāo)準(zhǔn)和協(xié)議
        
    #OSI協(xié)議
    OSI七層協(xié)議
        應(yīng)用層 
            HTTP協(xié)議:超文本傳輸協(xié)議
                HTTPS協(xié)議
                FTP協(xié)議
            表示層
            會(huì)話層
            傳輸層
            TCP協(xié)議/UDP協(xié)議,都是基于端口工作的協(xié)議
                TCP:流式協(xié)議、可靠協(xié)議(反饋機(jī)制),慢,打電話
                        基于TCP協(xié)議通信,必須先建立雙向通道:TCP協(xié)議的三次握手、四次揮手
                            三次握手:
                                洪水攻擊,一臺(tái)服務(wù)器在短時(shí)間內(nèi)接收到了大量的請(qǐng)求
                            四次揮手:
                                time_wait
                UDP:數(shù)據(jù)報(bào)協(xié)議,不可靠的協(xié)議,快,發(fā)短信,QQ
                無序建立雙向通道,數(shù)據(jù)的傳輸不安全
                端口:用來唯一標(biāo)識(shí)計(jì)算機(jī)上的某個(gè)應(yīng)用程序(0~65535),統(tǒng)常0~1024這些都是操作系統(tǒng)默認(rèn)使用的端口號(hào),建議手動(dòng)指定8000以后的端口號(hào)(訪問端口,輸出端口)
                mysql3306
                    redis6379
                    djando8000
                    flask5000
                    tomcat8080
                IP 端口:唯一標(biāo)識(shí)接入互聯(lián)網(wǎng)的一臺(tái)計(jì)算機(jī)上的某個(gè)應(yīng)用程序
                域名解析:URL DNS
            網(wǎng)絡(luò)層
            IP協(xié)議,規(guī)定了只要是接入互聯(lián)網(wǎng)的計(jì)算機(jī)都必須有一個(gè)IP地址(公網(wǎng)、私網(wǎng))
                IP地址的特點(diǎn):點(diǎn)分十進(jìn)制(0.0.0.0 255.255.255.255)
                IP地址目前有兩個(gè)版本:IPV4、IPV6
                路由器:實(shí)現(xiàn)局域網(wǎng)與局域網(wǎng)之間的互連
                交換機(jī):功能強(qiáng)大的路由器,讓連接了交換機(jī)的計(jì)算機(jī),實(shí)現(xiàn)彼此之間的互連
                局域網(wǎng):是構(gòu)成互聯(lián)網(wǎng)的基本單位
            數(shù)據(jù)鏈路層
            1.規(guī)定電信號(hào)的分組方式
                2.規(guī)定了任何一臺(tái)接入互聯(lián)網(wǎng)的計(jì)算機(jī),都必須有一塊網(wǎng)卡,該網(wǎng)卡上有世界上獨(dú)一無二的編號(hào)(mac地址),該編號(hào)由12位16進(jìn)制數(shù)組成(前六位是廠商編號(hào),后六位是流水線編號(hào))
                #1、2統(tǒng)稱為以太網(wǎng)協(xié)議(通信基本靠吼)(局域網(wǎng)內(nèi)使用)
                1.廣播風(fēng)暴(廣播、單播)
                #ARP協(xié)議:根據(jù)ip地址,獲取Mac地址,本地緩存
            物理連接層 
            基于電信號(hào),傳輸0100010001這樣的二進(jìn)制數(shù)據(jù)
        
        OSI五層協(xié)議
        應(yīng)用層
            傳輸層
            網(wǎng)絡(luò)層
            數(shù)據(jù)鏈路層
            物理連接層
            
#應(yīng)用程序所需要的的數(shù)據(jù),都是跟程序所在的那臺(tái)計(jì)算機(jī)的內(nèi)存去要
#TCP協(xié)議之所以可靠的原因在于反饋機(jī)制
反饋機(jī)制:計(jì)算機(jī)每次發(fā)數(shù)據(jù)的時(shí)候,必須等到對(duì)方的才會(huì)將內(nèi)存中的數(shù)據(jù)清除,否則會(huì)在一定的時(shí)間內(nèi),每隔一段時(shí)間發(fā)送一次

socket(套接字)

Ji

#server
import socket
server = socket.socket()            #不傳參數(shù),默認(rèn)使用的就是TCP協(xié)議,買手機(jī)
server.bind(('127.0.0.1',8080))      #bind內(nèi)為元組,127.0.0.1,為本地回環(huán)地址,插電話卡
server.listen(5)                    #半連接池,開機(jī)
conn,addr = server.accept()         #接聽電話,一直等待(阻塞)
data = conn.recv(1024)              #聽別人說話,接收1024個(gè)字節(jié),阻塞
print(data)
conn.send(b'hello baby')            #給別人回話
conn.close()                        #掛電話
server.close()                      #關(guān)機(jī)

#client
import socket
client = socket.socket()                    #拿電話
client.connect(('127.0.0.1',8080))          #撥號(hào),寫對(duì)方的ip和端口
client.send(b'hello world')                 #對(duì)別人說話
data = client.recv(1024)                    #聽別人說話,阻塞
print(data)
client.close()                              #掛電話

#send()與recv()不要出現(xiàn)兩邊相同的情況
#recv()是跟內(nèi)存要數(shù)據(jù),至于數(shù)據(jù)的來源,recv不管

循環(huán)通信

#server
import socket
server = socket.socket()            #生成一個(gè)對(duì)象
server.bind(('127.0.0.1',8080))      #綁定ip和端口
server.listen(5)                    #半連接池
conn,addr = server.accept()         #阻塞
while True:
    data = conn.recv(1024)              #聽別人說話,接收1024個(gè)字節(jié)
    print(data)
    conn.send(data.upper())            #給別人回話

# conn.close()                        #掛電話
# server.close()                      #關(guān)機(jī)

#client
import socket
client = socket.socket()                    #生成一個(gè)對(duì)象
client.connect(('127.0.0.1',8080))
while True:
    msg = input('請(qǐng)輸入要發(fā)送的內(nèi)容>>>: ').encode('utf-8')
    client.send(msg)                            #對(duì)別人說話
    data = client.recv(1024)                    #聽別人說話
    print(data)

# client.close()

socket通信的一些問題

#server
import socket
server = socket.socket()            #生成一個(gè)對(duì)象
server.bind(('127.0.0.1',8080))      #綁定ip和端口
server.listen(5)                    #半連接池
conn,addr = server.accept()         #阻塞,addr就是客戶端的地址
while True:
    try:
        data = conn.recv(1024)              #conn()類似于雙向通道
        print(data)                         #Mac和linux客戶端異常退出之后,服務(wù)端不會(huì)報(bào)錯(cuò),會(huì)一致接收b''
        if len(data) == 0:break
        conn.send(data.upper())            #給別人回話
    except ConnectionResetError as e:
        print(e)
        break
conn.close()                        #掛電話
server.close()                      #關(guān)機(jī)

#client
import socket
client = socket.socket()                    #生成一個(gè)對(duì)象
client.connect(('127.0.0.1',8080))
while True:
    msg = input('請(qǐng)輸入要發(fā)送的內(nèi)容>>>: ').encode('utf-8')
    if len(msg) == 0:continue               #解決客戶端輸入空,resc()同時(shí)出現(xiàn)的情況
    client.send(msg)                            #對(duì)別人說話
    data = client.recv(1024)                    #聽別人說話
    print(data)

# client.close()

連接循環(huán)

#服務(wù)端
固定的ip和端口
    24小時(shí)不間斷提供服務(wù)
    
#server
import socket
server = socket.socket()            #生成一個(gè)對(duì)象
server.bind(('127.0.0.1',8080))      #綁定ip和端口
server.listen(5)                    #半連接池,允許最大的等待數(shù)(連接數(shù)為6)
while True:
    conn,addr = server.accept()         #阻塞,addr就是客戶端的地址
    while True:
        try:
            data = conn.recv(1024)              #conn()類似于雙向通道
            print(data)                         #Mac和linux客戶端異常退出之后,服務(wù)端不會(huì)報(bào)錯(cuò),會(huì)一致接收b''
            if len(data) == 0:break
            conn.send(data.upper())            #給別人回話
        except ConnectionResetError as e:
            print(e)
            break
    conn.close()                        #掛電話
# server.close()                      #關(guān)機(jī)

#client
import socket
client = socket.socket()                    #生成一個(gè)對(duì)象
client.connect(('127.0.0.1',8080))
while True:
    msg = input('請(qǐng)輸入要發(fā)送的內(nèi)容>>>: ').encode('utf-8')
    if len(msg) == 0:continue               #解決客戶端輸入空,resc()同時(shí)出現(xiàn)的情況
    client.send(msg)                            #對(duì)別人說話
    data = client.recv(1024)                    #聽別人說話
    print(data)
# client.close()

模擬終端

#subprocess模塊
import subprocess
while True:
    cmd = input('請(qǐng)輸入您的命令>>>: ')
    obj = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    print(obj.stdout.read().decode('gbk'))        #正確命令返回結(jié)果,windows默認(rèn)使用gbk編碼
    print(obj.stderr.read().decode('gbk'))        #錯(cuò)誤命令返回結(jié)果

TCP協(xié)議的粘包問題

#TCP協(xié)議的特點(diǎn)
會(huì)將數(shù)據(jù)量比較小的,并且時(shí)間間隔比較短的數(shù)據(jù)一次性打包發(fā)給對(duì)方

#server
import socket
server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
conn,addr = server.accept()
data = conn.recv(5)
print(data)
data = conn.recv(5)
print(data)
data = conn.recv(4)
print(data)
conn.send(b'hello baby')
conn.close()
server.close()

#client
import socket
client = socket.socket()
client.connect(('127.0.0.1',8080))
client.send(b'hello')
client.send(b'world')
client.send(b'baby')
data = client.recv(8)
print(data)
client.close() 

#少的數(shù)據(jù)量將會(huì)一次打包發(fā)送給服務(wù)端,節(jié)省資源
#如果知道數(shù)據(jù)的發(fā)送方發(fā)送的字節(jié)數(shù),那么雙方的信息就可以不用在擔(dān)心'字節(jié)長(zhǎng)度問題'

struct模塊

#struct模塊
可以將任意字符串打包成字節(jié)長(zhǎng)度為4的包,解包后仍可以得到原來字符串的長(zhǎng)度
    當(dāng)原始數(shù)據(jù)特別大的時(shí)候,i模式裝不下了,這個(gè)時(shí)候就需要更換模式

import struct
str = 'evfreatteg.t.g..t;hyh;y;5;yjjjjjn'
print('原始的: ',len(str))
str1 = struct.pack('i',len(str))        #將數(shù)據(jù)打包
print(len(str1))                        #包長(zhǎng)度固定位4
str2 = struct.unpack('i',str1)[0]       #將數(shù)據(jù)解包
print('解包后的: ',str2)

原始的:  33
4
解包后的:  33

使用struct模塊解決粘包問題

#解決粘包問題 
服務(wù)端:
    1.先制作一個(gè)要發(fā)送給客戶端的字典
        2.制作字典的報(bào)頭
        3.發(fā)送字典的報(bào)頭
        4.發(fā)送字典
        5.再發(fā)送真實(shí)數(shù)據(jù)長(zhǎng)度
    客戶端:
    1.先接受字典的報(bào)頭
        2.解析拿到字典的數(shù)據(jù)長(zhǎng)度
3.接收字典
        4.從字典中獲取真實(shí)數(shù)據(jù)長(zhǎng)度
        5.接收真實(shí)數(shù)據(jù)
        
#server
import socket
import subprocess
import struct
import json
server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
while True:
    conn,addr = server.accept()
    while True:
        try:
            cmd = conn.recv(1024)
            if len(cmd) == 0:break
            cmd = cmd.decode('utf-8')
            obj = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
            res = obj.stdout.read()   obj.stderr.read()
            d = {'name':'syy','file_size':len(res),'info':'大家為我驕傲'}
            json_d = json.dumps(d)
            #1.先制作一個(gè)字典的報(bào)頭
            header = struct.pack('i',len(json_d))
            #2.發(fā)送字典報(bào)頭
            conn.send(header)
            #3.發(fā)送字典
            conn.send(json_d.encode('utf-8'))
            #4.再發(fā)送真實(shí)數(shù)據(jù)
            conn.send(res)
            # conn.send(obj.stdout.read())  #只能read()一次
            # conn.send(obj.stderr.read())
        except ConnectionResetError as e:
            print(e)
            break
    conn.close()
# server.close()                      #關(guān)機(jī)

#client
import socket
import struct
import json
client = socket.socket()                    #生成一個(gè)對(duì)象
client.connect(('127.0.0.1',8080))
while True:
    msg = input('請(qǐng)輸入要發(fā)送的內(nèi)容>>>: ').encode('utf-8')
    if len(msg) == 0:continue               #解決客戶端輸入空,resc()同時(shí)出現(xiàn)的情況
    client.send(msg)                            #對(duì)別人說話
    #1.先接收字典報(bào)頭
    header_dict = client.recv(4)
    #2.解析報(bào)頭,獲取字典長(zhǎng)度
    dict_size = struct.unpack('i',header_dict)[0]
    #3.循環(huán)接收字典數(shù)據(jù)
    dict_bytes = client.recv(dict_size)
    dict_json = json.loads(dict_bytes.decode('utf-8'))
    #4.從字典中獲取信息
    print(dict_json)
    recv_size = 0
    real_data = b''
    while recv_size < dict_json.get('file_size'):
        data = client.recv(1024)
        real_data  = data
        recv_size  = len(data)
    print(real_data.decode('gbk'))
# client.close()

練習(xí)

#習(xí)題
寫一個(gè)上傳電影的功能
    1.循環(huán)打印某一個(gè)文件夾下面的所有的文件
        2.用戶想要上傳的文件
        3.將用戶選擇的文件上傳到服務(wù)器
        4.服務(wù)端保存該文件
        
#server
import socket
import subprocess
import struct
import json
server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
while True:
    conn,addr = server.accept()
    while True:
        try:
            header_len = conn.recv(4)
            #解析字典報(bào)頭
            header_len = struct.unpack('i',header_len)[0]
            #在接收字典數(shù)據(jù)
            header_dic = conn.recv(header_len)
            real_dic = json.loads(header_dic.decode('utf-8'))
            #獲取真實(shí)數(shù)據(jù)長(zhǎng)度
            total_size = real_dic.get('file_size')
            #循環(huán)接收并寫入文件
            recv_size = 0
            with open(real_dic.get('file_name'),'wb') as f:
                while recv_size < total_size:
                    data = conn.recv(1024)
                    f.write(data)
                    recv_size  = len(data)
                print('上傳成功')
        except ConnectionResetError as e:
            print(e)
            break
    conn.close()
# server.close()                      #關(guān)機(jī)

#client
import socket
import struct
import json
import os
client = socket.socket()                    #生成一個(gè)對(duì)象
client.connect(('127.0.0.1',8080))
while True:
    #獲取電影列表,循環(huán)展示
    MOVIE_DIR = r'D:\python視頻\day29\視頻'
    movie_list = os.listdir(MOVIE_DIR)
    for i,movie in enumerate(movie_list,1):
        print(i,movie)
    #用戶選擇
    choise = input('請(qǐng)輸入電影序號(hào)>>>: ').strip()
    #判斷是否是數(shù)字字符串
    if choise.isdigit():
        choise = int(choise)
        #判斷用戶輸入的值的范圍是否有效
        if choise in range(1,len(movie_list) 1):
            #獲取到用戶想要上傳的文件名
            path = movie_list[choise-1]
            #拼接文件的絕對(duì)路徑
            file_path = os.path.join(MOVIE_DIR,path)
            #獲取文件大小
            file_size = os.path.getsize(file_path)
            #定義一個(gè)字典
            res_d = {
                'file_name':path,
                'file_size':file_size,
                'msg':'尼桑~'
            }
            #序列化字典
            json_d = json.dumps(res_d)
            json_bytes = json_d.encode('utf-8')
            #1.制作字典格式報(bào)頭
            header = struct.pack('i',len(json_bytes))
            #2.發(fā)送字典報(bào)頭
            client.send(header)
            #3.再發(fā)字典
            client.send(json_bytes)
            #4.再發(fā)文件數(shù)據(jù),打開文件循環(huán)發(fā)送
            with open(file_path,'rb') as f:
                for line in f:
                    client.send(line)
    else:
        print('請(qǐng)輸入數(shù)字序號(hào)!')

異常處理

#什么是異常
程序在運(yùn)行過程中,出現(xiàn)不可預(yù)知的錯(cuò)誤
    并且該錯(cuò)誤沒有對(duì)應(yīng)的處理機(jī)制,那么就會(huì)以異常的形式表現(xiàn)出來
    造成的影響是整個(gè)程序無法正常運(yùn)行
    
#異常的結(jié)構(gòu)
1.異常的類型NAMEERROP
    2.異常的信息name 'hhhhhhh' is not defined
    3.異常的位置File "E:/python_test/a.py", line 6, in <module>
    
#異常的種類
1.語法錯(cuò)誤
    是程序員可以立刻解決的,這種錯(cuò)誤是不能容忍的
        
    2.邏輯錯(cuò)誤
    這種錯(cuò)誤是可以被容忍的,因?yàn)橐谎劭床怀鰜?        針對(duì)邏輯上的錯(cuò)誤,可以采用異常處理機(jī)制進(jìn)行捕獲
        
#常見的錯(cuò)誤類型
1.名字錯(cuò)誤NAMEERROP,變量名、函數(shù)名、類名不存在
    2.語法錯(cuò)誤SyntaxError,if/while
    3.鍵不存在KeyError
d = {'name':'syy'}
print(d['password'])
4.值錯(cuò)誤ValueError
int('ssss')
5.索引錯(cuò)誤IndexError
l = [1,2,3]
print(l[111])
6.關(guān)鍵字assert斷言錯(cuò)誤  AssertionError

#異常處理
在你認(rèn)為可能會(huì)出現(xiàn)bug的代碼塊上方try一下(try代碼塊越少越好)
    
#異常處理的格式
try:
    想要監(jiān)控的代碼塊
except 錯(cuò)誤類型:
    監(jiān)控到錯(cuò)誤類型后自定義的反饋
    
try:
    想要監(jiān)控的代碼塊
except 錯(cuò)誤類型 as e:#e代表本來代碼的錯(cuò)誤反饋
    監(jiān)控到錯(cuò)誤類型后自定義的反饋
    
try:
    想要監(jiān)控的代碼塊
except 錯(cuò)誤類型:
    監(jiān)控到錯(cuò)誤類型后自定義的反饋
else:
    print('被檢測(cè)的代碼沒有任何異常發(fā)生,才會(huì)走else')
finally:
    print('被檢測(cè)的代碼無論有沒有異常發(fā)生,都會(huì)走finally')
    
#例
try:
    name
except NameError:
    print('NameError已被我處理')
    
    #except可以跟多個(gè)
try:
    # name
    # l = [1,2,3]
    # l[100]
    # d = {'name':'syy'}
    # d['password']
    # if#語法錯(cuò)誤不能被監(jiān)控
    int('www')
except NameError:
    print('NameError已被我處理')
except IndexError:
    print('IndexError已被我處理')
except KeyError:
    print('KeyError已被我處理')
except SyntaxError:
    print('SyntaxError已被我處理')
except ValueError:
    print('ValueError已被我處理')
    
    #萬能異常捕獲
try:
    # name
    # l = [1,2,3]
    # l[100]
    # d = {'name':'syy'}
    # d['password']
    # if
    int('www')
except Exception:#萬能異常捕獲,繼承自BaseException
    print('所有異常已被我處理')
    
    #else語法
try:
    # name
    # l = [1,2,3]
    # l[100]
    # d = {'name':'syy'}
    # d['password']
    # if
    int('1')
except Exception:
    print('所有異常已被我處理')
else:
    print('被檢測(cè)的代碼沒有任何異常發(fā)生,才會(huì)走else')
finally:
    print('被檢測(cè)的代碼無論有沒有異常發(fā)生,都會(huì)走finally')

拋出異常

#關(guān)鍵字raise,就是主動(dòng)拋出異常

if 'syy' == 'cool':
    pass
else:
    raise NameError('我覺得不對(duì)...')

斷言錯(cuò)誤

#關(guān)鍵字assert
在關(guān)鍵字assert預(yù)言的位置,如果語言對(duì)了,代碼正常執(zhí)行,錯(cuò)了的話,報(bào)AssertionError錯(cuò)誤

l = [1,2,3]
assert len(l) > 0
print('斷言對(duì)了才會(huì)走這行代碼')

自定義異常

#主動(dòng)拋出異常,其實(shí)就是將異常類的對(duì)象打印出來,會(huì)走_(dá)_str__方法(對(duì)象的屬性被打印的時(shí)候觸發(fā))

class MyError(BaseException):
    def __init__(self,msg):
        super().__init__()
        self.msg = msg
    def __str__(self):
        return '<%shhhhhh>' %self.msg
raise MyError('自定義異常')

網(wǎng)絡(luò)編程之 UDP

UDP通信的基本使用

#UDP通信
數(shù)據(jù)包協(xié)議自帶報(bào)頭
    基于UDP協(xié)議的數(shù)據(jù)傳輸,數(shù)據(jù)是不安全的(客戶端只發(fā),無論服務(wù)端有沒有接收)
    
#server
import socket
server = socket.socket(type=socket.SOCK_DGRAM)      #UDP協(xié)議
server.bind(('127.0.0.1',8080))
#UDP沒有半連接池的概念不需要設(shè)置半連接池
#因?yàn)闆]有雙向通道,所以不需要accept,直接設(shè)置通信循環(huán)即可
while True:
    data,addr = server.recvfrom(1024)
    print('數(shù)據(jù)',data)        #客戶端發(fā)來的消息
    print('地址',addr)        #客戶端地址
    server.sendto(data.upper(),addr)
    
#client
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
#不需要建立連接,直接進(jìn)入通訊循環(huán)
server_address = ('127.0.0.1',8080)
while True:
    client.sendto(b'hellow',server_address)
    data,addr = client.recvfrom(1024)
    print('服務(wù)端發(fā)來的數(shù)據(jù)',data)
    print('服務(wù)端的地址',addr)
    
#UDP類似于發(fā)短信,TCP類似于打電話

UDP協(xié)議與TCP協(xié)議的異同

#TCP協(xié)議
1.TCP協(xié)議客戶端允許為空
    2.TCP協(xié)議存在粘包問題
    3.udp協(xié)議服務(wù)端不存在的情況下,客戶端照樣會(huì)報(bào)錯(cuò)
    4.TCP協(xié)議不支持并發(fā),使用模塊可以做到并發(fā)
    
#UDP協(xié)議
1.udp協(xié)議客戶端允許為空?是的
    2.udp協(xié)議不會(huì)粘包?會(huì)的
    3.udp協(xié)議服務(wù)端不存在的情況下,客戶端照樣不會(huì)報(bào)錯(cuò)?會(huì)報(bào)錯(cuò),client.recvfrom(1024)報(bào)錯(cuò)
    4.udp協(xié)議支持并發(fā)是的
    
#并發(fā):看起來像是同時(shí)運(yùn)行
#并行:真正意義上的同時(shí)運(yùn)行

基于UDP協(xié)議實(shí)現(xiàn)簡(jiǎn)易版的QQ

#server
import socket
server = socket.socket(type=socket.SOCK_DGRAM)      #UDP協(xié)議
server.bind(('127.0.0.1',8080))
while True:
    data,addr = server.recvfrom(1024)
    print(data.decode('utf-8'))        #客戶端發(fā)來的消息
    msg = input('請(qǐng)輸入你要發(fā)送的內(nèi)容>>>: ').strip()
    server.sendto(msg.encode('utf-8'),addr)
    
#client
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
server_address = ('127.0.0.1',8080)
while True:
    msg = input('請(qǐng)輸入您要發(fā)送的內(nèi)容(客戶端1)>>>: ').strip()
    client.sendto(msg.encode('utf-8'),server_address)
    data,addr = client.recvfrom(1024)
    print(data.decode('utf-8'))

socketserver模塊

模塊的簡(jiǎn)單使用

#server
import socketserver
class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        print('來了?老弟')
        
#創(chuàng)建一個(gè)基于TCP的對(duì)象
#只要有客戶端連接,會(huì)自動(dòng)交給自定義類中的handler方法去處理
server = socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer)
#啟動(dòng)該服務(wù)的對(duì)象
server.serve_forever()

#client
import socket
client = socket.socket()
client.connect(('127.0.0.1',8080))

socketserver模塊使TCP協(xié)議支持并發(fā)

#server
import socketserver
class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        # print('來了?老弟')
        while True:
            data = self.request.recv(1024)
            print(self.client_address)      #客戶端地址
            print(data.decode('utf-8'))
            self.request.send(data.upper())

#村趕緊啊一個(gè)基于TCP的對(duì)象
server = socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer)
#啟動(dòng)該服務(wù)的對(duì)象
server.serve_forever()

#client
import socket
client = socket.socket()
client.connect(('127.0.0.1',8080))
while True:
    client.send(b'hello')
    data = client.recv(1024)
    print(data.decode('utf-8'))

socketserver模塊與UDP協(xié)議

#server
import socketserver
class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        # print('來了?老弟')
        while True:
            data,sock = self.request
            print(self.client_address)      #客戶端地址
            print(data.decode('utf-8'))
            sock.sendto(data.upper(),self.client_address)

#村趕緊啊一個(gè)基于TCP的對(duì)象
server = socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyServer)
#啟動(dòng)該服務(wù)的對(duì)象
server.serve_forever()

#client
import socket
import time
client = socket.socket(type=socket.SOCK_DGRAM)
server_address = ('127.0.0.1',8080)
while True:
    client.sendto(b'hello',server_address)
    data,addr = client.recvfrom(1024)
    print(data.decode('utf-8'),addr)
    time.sleep(1)
來源:https://www./content-1-782451.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多