0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

汽車電子技術(shù) ? 來源:程序猿知秋 ? 作者: 程序猿知秋 ? 2023-02-16 15:45 ? 次閱讀

網(wǎng)絡(luò)通信基本概述

  • 網(wǎng)絡(luò)是什么?
    • 網(wǎng)絡(luò)就是輔助雙方或多方連接在一起的工具
  • 使用網(wǎng)絡(luò)的目的?
    • 使連接網(wǎng)絡(luò)的多方,能進行數(shù)據(jù)傳遞
  • 網(wǎng)絡(luò)編程是什么?
    • 就是讓在不同電腦上的軟件能進行數(shù)據(jù)傳遞
  • IP地址是什么?
    • 用來在網(wǎng)絡(luò)中標(biāo)記一臺電腦,比如:192.168.1.1;在本地局域網(wǎng)內(nèi)是唯一的
  • 查看本機ip地址
    • 在dos命令窗口中,輸入:ipconfig
    • 圖片
  • 什么是端口?
    • 端口是通過端口號來標(biāo)記的,范圍是從 0~65535
    • 知名端口
      • 眾所周知的端口號,范圍 0~1023,例如:80端口是http的,21端口是ftp用的
      • 一般情況下,程序要使用知名端口是需要管理員權(quán)限的
    • 動態(tài)端口
      • 動態(tài)端口一般不固定,是動態(tài)分配的,范圍從 1024~65535
      • 動態(tài)分配是指,當(dāng)一個程序需要網(wǎng)絡(luò)通信時,它向主機申請一個端口,主機從可用的端口中分配一個供它使用,當(dāng)這個程序關(guān)閉時,同時會釋放占用的端口
    • 可以在命令窗口中輸入:** netstat -ano **查看端口狀態(tài)

socket概述

  • 什么是socket?
    • socket 簡稱 套接字 ,是進程間通信的一種方式,它與其它進程間通信的一個主要不同是:它能實現(xiàn)不同主機間的通信,例如:QQ、微信等
  • Python中,使用socket 模塊的函數(shù) socket 來創(chuàng)建通信

語法

import socket
socket.socket(family,type)

參數(shù)說明

  • **family: **可以選擇 AF_INET(用于Internet 進程間通信) 或者 AF_UNIX (用于另一臺機器進程間通信),實際工作中常用AF_INET
  • Type: 套接字類型,可以是SOCK_STREAM(流式套接字,主要用于TCP協(xié)議) 或者 SOCK_DGRAM(數(shù)據(jù)報套接字,主要用于UDP協(xié)議)

**說明

**

  • 套接字使用流程與文件使用流程類似
    • 創(chuàng)建套接字
    • 使用套接字收/發(fā)數(shù)據(jù)
    • 關(guān)閉套接字

示例

import socket
# 創(chuàng)建TCP的套接字 (點對點)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)


# 發(fā)送或者接收信息 ...


# 關(guān)閉套接字
s.close()


# 創(chuàng)建UDP的套接字 (一對多,廣播形式)
s2=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)


# 發(fā)送或者接收信息 ...


# 關(guān)閉套接字
s2.close()

UDP協(xié)議

  • 介紹
    • 用戶數(shù)據(jù)報協(xié)議,是一個無連接的簡單的面向數(shù)據(jù)報的運輸層協(xié)議
    • UDP數(shù)據(jù)包括目的端口號和源端口號信息,由于通訊不需要連接,所以可以實現(xiàn)廣播發(fā)送
  • 優(yōu)點
    • 傳輸速度快
    • 有效傳輸?shù)臄?shù)據(jù)量最多為500bytes
  • 缺點
  • 發(fā)送數(shù)據(jù),無需對方確認(不可靠)
  • 容易丟包
  • 應(yīng)用場景
    • UDP廣泛應(yīng)用于需要相互傳輸數(shù)據(jù)的網(wǎng)絡(luò)應(yīng)用中,如QQ使用的就是UDP協(xié)議
    • 在局域網(wǎng)中,如果要想局域網(wǎng)內(nèi)所有計算機發(fā)送數(shù)據(jù),可以使用廣播,廣播不能用TCP實現(xiàn),可以用UDP實現(xiàn)

**示例

**

**客戶端

**

import socket


# 創(chuàng)建UDP的套接字
udpSocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#  允許套接口傳送廣播信息,當(dāng)option_value不等于0時,允許,否則,禁止
udpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)


port=33333
# ip 為廣播形式,也可以用255.255.255.25 表示全局域網(wǎng)都可以接收
network=''
# 發(fā)送廣播數(shù)據(jù)
udpSocket.sendto("我在發(fā)送數(shù)據(jù)!!".encode("utf-8"),(network,port))


# 關(guān)閉
udpSocket.close()

服務(wù)端

import socket


# 創(chuàng)建UDP的套接字
udpSocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#  允許套接口傳送廣播信息
udpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)


port=33333
# 綁定ip和端口,本機ip可以不寫
udpSocket.bind(('',port))


# 等待接收方發(fā)送數(shù)據(jù),1024表示本次接收的最大字節(jié)數(shù)
data,address=udpSocket.recvfrom(1024)
print("接收到的數(shù)據(jù)是:%s,地址是:%s"%(data.decode("utf-8"),str(address)))


# 關(guān)閉
udpSocket.close()

TCP協(xié)議

  • 介紹
    • TCP協(xié)議,是一種傳輸控制協(xié)議,是一種面向連接的,可靠的,基于字節(jié)流的傳輸層控制協(xié)議,由IETF的RFC 793定義
    • TCP是一種點對點的傳輸方式
    • TCP協(xié)議編寫的三個步驟:創(chuàng)建連接、數(shù)據(jù)傳遞、關(guān)閉連接
    • TCP 通信模型中,在通信開始之前,一定要先建立相關(guān)的連接,才能發(fā)送數(shù)據(jù)
  • 優(yōu)點
    • 可靠,穩(wěn)定 TCP的可靠體現(xiàn)在TCP在傳遞數(shù)據(jù)之前,會有三次握手來建立連接
    • 在數(shù)據(jù)傳遞時,有確認、重傳、擁塞控制機制
    • 在數(shù)據(jù)傳完后,會斷開連接用來節(jié)約系統(tǒng)資源
  • 缺點
    • 慢,效率低,占用系統(tǒng)資源高
    • 易被攻擊,TCP有確認機制、三次握手機制,這些也導(dǎo)致TCP容易被人利用,實現(xiàn)DOS、DDOS、CC等攻擊

TCP與UDP的區(qū)別

  • 面向連接
    • TCP面向連接(如打電話要先撥號建立連接)
    • UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接
  • 可靠
    • TCP提供可靠的服務(wù)。也就是說,通過TCP連接傳送的數(shù)據(jù),無差錯,不丟失,不重復(fù),且按序到達
    • UDP盡最大努力交付,不需要對方確認,即不保證可靠交付
  • 字節(jié)流
    • TCP面向字節(jié)流,實際上是TCP把數(shù)據(jù)看成一連串無結(jié)構(gòu)的字節(jié)流
    • UDP是面向報文的,UDP沒有擁塞控制,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會使源主機的發(fā)送速率降低(對實時應(yīng)用很有用,如IP電話,實時視頻會議等)
  • 連接性
    • TCP連接只能是點到點的
    • UDP支持一對一,一對多,多對一和多對多的交互通信
  • 首部開銷
    • TCP首部開銷20字節(jié)
    • UDP首部開銷小,只有8個字節(jié)
  • 信道
    • TCP的邏輯通信信道是全雙工的可靠信道
    • UDP則是不可靠信道

示例

服務(wù)端

import socket


# 創(chuàng)建tcp 的套接字
tcp_socekt=socket.socket(socket.AF_INET,socket.SOCK_STREAM)


# ip與端口,本機ip可以不寫
addr=('',44444)
# 綁定地址
tcp_socekt.bind(addr)


# 使用socket創(chuàng)建的套接字默認的屬性是 主動的,使用 listen 將其變?yōu)楸粍?,這樣就可以接收別人的連接了, 128表示允許的最大連接數(shù)
tcp_socekt.listen(128)


# 如果有一個新的客戶端來連接服務(wù)器,那么就產(chǎn)生一個新的套接字專門為這個客戶端服務(wù)
# client_socket 用來為這個客戶端服務(wù)
# tcp_socket 就可以用來專門等待其他新客戶端的鏈接
client_socket,client_addr=tcp_socekt.accept()


# 接收對方發(fā)過來的數(shù)據(jù)
data=client_socket.recv(1024)
print("接收到的數(shù)據(jù)是:%s,地址是:%s"%(data.decode("utf-8"),str(client_addr)))


# 發(fā)送數(shù)據(jù)到客戶端
client_socket.send("hello....".encode("utf-8"))


# 關(guān)閉為這個客戶端服務(wù)的套接字,一旦關(guān)閉,就意味著不能再為這個客戶端服務(wù)了
client_socket.close()


# 關(guān)閉外面總的 套接字,一旦關(guān)閉,則意味著不再接收任何連接了
tcp_socekt.close()

客戶端

import socket


# 創(chuàng)建tcp 套接字
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)


# 目標(biāo)服務(wù)器地址
dest_addr=("127.0.0.1",44444)


# 連接目標(biāo)服務(wù)器
tcp_socket.connect(dest_addr)


# 發(fā)送數(shù)據(jù)
tcp_socket.send("我是客戶端".encode("utf-8"))


# 接收對方發(fā)過來的數(shù)據(jù),最大接收1024個字節(jié)
data=tcp_socket.recv(1024)
print("接收到的數(shù)據(jù)是:%s"%data.decode("utf-8"))


# 關(guān)閉套接字
tcp_socket.close()
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    14

    文章

    7388

    瀏覽量

    88208
  • 工具
    +關(guān)注

    關(guān)注

    4

    文章

    307

    瀏覽量

    27606
  • 輔助
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    10508
收藏 人收藏

    評論

    相關(guān)推薦

    Labview與Python網(wǎng)絡(luò)編程

    Labview素有測試之王的美譽,圖形化編程和快速搭建自動化平臺讓人愛不釋手。但是Labview不能在安卓平臺上運行,開發(fā)web也力不從心。如果labview配合上Python簡直就如虎添翼了
    發(fā)表于 11-12 13:48

    Python學(xué)習(xí)之網(wǎng)絡(luò)編程Socket分享

    Python學(xué)習(xí)之網(wǎng)絡(luò)編程Socket
    發(fā)表于 07-02 08:18

    請問python-樹莓派如何通過按鍵控制步進電機正反轉(zhuǎn)?

    步進電機驅(qū)動原理是什么?python-樹莓派如何通過按鍵控制步進電機正反轉(zhuǎn)?
    發(fā)表于 10-09 08:45

    python-控制khr3hv-master機器人

    python-控制khr3hv機器人,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 11-22 15:40 ?2次下載

    設(shè)計多網(wǎng)絡(luò)協(xié)議的Python網(wǎng)絡(luò)編程的探索性指南

    很高興看到本書出版了,我要感謝所有為本書的出版做出貢獻的人。本書是Python網(wǎng)絡(luò)編程方面的探索性指南,涉及了很多網(wǎng)絡(luò)協(xié)議
    發(fā)表于 09-14 10:47 ?5次下載

    python-速成指南

    python 提供好用的兩個容器:list 和 dict。插句題外話,其實最好用的容器還是 PHP 提供的關(guān)聯(lián)數(shù)組,一個數(shù)組就包括了 python 中 list 和 dict 的全部功能,實在是很贊。
    發(fā)表于 03-28 16:32 ?9次下載

    Python網(wǎng)絡(luò)編程基礎(chǔ)

    Python網(wǎng)絡(luò)編程基礎(chǔ)知識免費下載。
    發(fā)表于 06-01 14:29 ?23次下載

    Python編程入門》.pdf

    Python編程入門》.pdf
    發(fā)表于 02-11 16:03 ?0次下載

    Python-基本概念

    python源程序就是一個特殊的文本文件,可以使用任意文本編輯軟件做開發(fā)
    的頭像 發(fā)表于 02-16 14:49 ?557次閱讀
    <b class='flag-5'>Python-</b>基本概念

    Python-模塊與包

    模塊是Python 程序架構(gòu)的一個核心概念
    的頭像 發(fā)表于 02-16 14:55 ?691次閱讀
    <b class='flag-5'>Python-</b>模塊與包

    Python-字典

    dictionary (字典) **是除列表外** Python **中,最靈活的數(shù)據(jù)類型
    的頭像 發(fā)表于 02-16 15:02 ?549次閱讀
    <b class='flag-5'>Python-</b>字典

    Python-字符串

    字符串就是 一串字符 ,是編程語言中表示文本的數(shù)據(jù)類型,在Python中使用一對雙引號 "" 或者一對單引號來定義.
    的頭像 發(fā)表于 02-16 15:05 ?953次閱讀
    <b class='flag-5'>Python-</b>字符串

    如何搭建Python編程環(huán)境

    Python是一種高級編程語言,被廣泛用于科學(xué)計算、數(shù)據(jù)分析、人工智能、Web開發(fā)等領(lǐng)域。想要學(xué)習(xí)Python編程,首先需要搭建一個合適的編程
    的頭像 發(fā)表于 04-14 12:07 ?4957次閱讀

    網(wǎng)絡(luò)工程師學(xué)Python-遠程連接管理Telnet

    Python Telnet是一種用于遠程連接和管理網(wǎng)絡(luò)設(shè)備的Python庫。
    的頭像 發(fā)表于 04-28 09:47 ?808次閱讀

    如何使用Python進行神經(jīng)網(wǎng)絡(luò)編程

    。 為什么使用PythonPython是一種廣泛使用的高級編程語言,以其易讀性和易用性而聞名。Python擁有強大的庫,如TensorFlow、Keras和PyTorch,這些庫提
    的頭像 發(fā)表于 07-02 09:58 ?266次閱讀