Day19-網(wǎng)絡(luò)通信

一、socket

socket又叫套接字,實現(xiàn)網(wǎng)絡(luò)通信的兩端就是套接字。分為服務(wù)器對應(yīng)的套接字和客戶端對應(yīng)的套接字
python通過提供socket標(biāo)準(zhǔn)庫來支持socket編程。
socket編程就是用程序?qū)崿F(xiàn)服務(wù)器和客戶端

發(fā)送圖片的服務(wù)器代碼

import socket
# ========寫一個服務(wù)器程序=======
# 1.創(chuàng)建服務(wù)器對應(yīng)的套接字對象(買了一個座機機器)
"""
socket(family, type)
family: 設(shè)置ip類型  AF_INET(ipv4) -> 默認(rèn)值   AF_INET6(ipv6) 
type:設(shè)置傳輸類型  SOCK_STREAM(TCP可靠傳輸) -> 默認(rèn)值   SOCK_DGRAM(UDP不可靠傳輸)
"""
server = socket.socket()  # 創(chuàng)建一個基于ipv4的可靠傳輸?shù)姆?wù)器套接字

# 2.綁定IP和端口(插電話線-確定電話號碼)
"""
bind((ip, 端口))
ip: 服務(wù)器的地址
端口:不同的端口用來區(qū)分電腦上不同服務(wù)。取值范圍是0~65535,注意0~1024屬于著名端口(用來綁定特殊服務(wù)端口,不要隨便用)
注意:同一時間同一個端口只能綁定一個服務(wù)
"""
server.bind(('10.7.156.97', 8082))

# 3.監(jiān)聽請求(交電話費)
"""
listen(個數(shù)) --> 需要通過數(shù)字設(shè)置服務(wù)器一次可以處理最大的請求個數(shù)
"""
server.listen(512)
print('開始監(jiān)聽')

# 4.讓服務(wù)一直處于啟動狀態(tài)
while True:
    # 5.接收客戶端的請求(電話響了,接電話)
    """
    執(zhí)行到accept(),程序會停下來,知道有客戶端在請求這個服務(wù)器的時候才會往下執(zhí)行。返回會話和客戶端的地址
    """
    print('=====')
    conversation, addr = server.accept()
    print(addr)

    # 6.服務(wù)器給客戶端發(fā)送數(shù)據(jù)(說話)
    """
    send(data) --> 發(fā)送數(shù)據(jù)
    data: 需要發(fā)送的數(shù)據(jù),要求是二進制數(shù)據(jù)(bytes)
    
    a.str 轉(zhuǎn) bytes:
    bytes(字符串,encoding='utf-8)
    字符串.encode(編碼方式)
    """
    # message = input('>>>')
    # # message_data = bytes(message, encoding='utf-8')
    # message_data = message.encode('utf-8')
    # conversation.send(message_data)

    # 發(fā)送一張圖片
    with open('./files/luffy4.jpg', 'br') as f:
        content = f.read()
        conversation.send(content)
        # 關(guān)閉連接
        conversation.close()



    # 7.接收客戶端發(fā)送的消息(聽電話)
    """
    recv(字節(jié)數(shù)) --> 接收從客戶端發(fā)送的數(shù)據(jù),參數(shù)是用來設(shè)置一次能接收的最大字節(jié)數(shù)。返回值是接收到的數(shù)據(jù)(二進制)
    
    bytes 轉(zhuǎn) 字符串
    str(二進制,encoding='utf-8')
    二進制.decode(編碼方式)
    
    注意:recv方法也會阻塞線程,程序運行到這兒會停下等,等到對方發(fā)送消息為止
    """
    # data = conversation.recv(1024)
    # # re_message = str(data, encoding='utf-8')
    # re_message = data.decode('utf-8')
    # print(re_message)

接受圖片的客戶端代碼:

import socket

client = socket.socket()
client.connect(('10.7.156.97', 8082))

message_re = client.recv(1024)
data = bytes()  # 創(chuàng)建一個空的二進制數(shù)據(jù)
while message_re:

    # print(message_re)
    data += message_re  # 將每次獲取到的數(shù)據(jù)疊加
    # print('接收到數(shù)據(jù)')
    message_re = client.recv(1024)

with open('./new.jpg', 'bw') as f:
    f.write(data)
print('接收完成')

二、互相對話的服務(wù)器與客戶端

服務(wù)器代碼:

import socket

# 1.創(chuàng)建服務(wù)器套接字
server = socket.socket()
# 2.綁定地址
server.bind(('10.7.156.97', 8080))
# 3.監(jiān)聽
server.listen(100)

# 讓服務(wù)器一直處于運行狀態(tài)
while True:
    # 4.接收請求
    conversation, addr = server.accept()
    print(addr)
    # 保持通話
    while True:
        # 接收消息
        message_re = conversation.recv(1024).decode('utf-8')

        print('客戶端(%s): %s' % (addr[0][-2:], message_re))
        if message_re == '拜拜':
            break

        # 發(fā)送消息
        message = input('服務(wù)器:')
        conversation.send(message.encode('utf-8'))
        if message == '拜拜':
            break

客戶端代碼:

import socket

# 1.創(chuàng)建客戶端套接字對象
client = socket.socket()

# 2.連接服務(wù)器
"""
connect(地址)
"""
client.connect(('10.7.156.97', 8080))

while True:
    # 4.給服務(wù)器發(fā)送消息
    message = input('客戶端:')
    client.send(message.encode('utf-8'))
    if message == '拜拜':
        break

    # 3.接收服務(wù)器返回的數(shù)據(jù)
    re_data = client.recv(1024)
    print('服務(wù)器:',re_data.decode('utf-8'))
    if re_data.decode('utf-8') == '拜拜':
        break

三、requests請求

python沒有一個標(biāo)準(zhǔn)庫來支持網(wǎng)絡(luò)請求,但是目前有一個第三方庫,支持http請求

import requests

requests.get(url, params) --> 返回服務(wù)的響應(yīng)

url -> 請求地址
params -> 客戶端給服務(wù)發(fā)送的數(shù)據(jù)(字典) {參數(shù)名:值}
# https://www.apiopen.top/satinApi?type=1&page=1
url = 'https://www.apiopen.top/satinApi'
response = requests.get(url, {'type': 1, 'page': 1})

1.獲取響應(yīng)頭

print(response.headers)

2.拿二進制形式的響應(yīng)體

data_bytes = response.content
print(type(data_bytes))

3.拿字符串形式的響應(yīng)體

data_text = response.text
print(type(data_text), data_text)

4.拿json格式對應(yīng)python數(shù)據(jù)

data_json = response.json()
print(type(data_json), data_json['code'],)

下載圖片到本地

response = requests.get('http://wimg.spriteapp.cn/profile/large/2018/02/24/5a90448611639_mini.jpg')
content = response.content
with open('./aa.jpg', 'wb') as f:
    f.write(content)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,978評論 1 92
  • 1.socket服務(wù)器 代碼示例 2.socket客戶端 代碼示例 3.socket服務(wù)器升級 代碼示例 4.接受...
    _桑心人閱讀 173評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評論 19 139
  • 我喜歡把那些確確實實存在的人和事,賦予自己的情感色彩,說成故事,覺得那樣的文字,溫柔又幸福…… 杭州西湖的北山路有...
    安南燼閱讀 715評論 4 1
  • 大年初一至正月十六 樂游路 伴山書屋 書院門 皆有民眾自發(fā)設(shè)置之?dāng)傸c 舊書舊報古董老物件 隨便看隨便挑 今日微雨且...
    張耘菩閱讀 792評論 81 66

友情鏈接更多精彩內(nèi)容