日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python socket编程步骤_python-socket编程(入门,网络基础)

發(fā)布時間:2025/3/20 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python socket编程步骤_python-socket编程(入门,网络基础) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、網絡基礎

網絡建立的目的是為了數據交互(通信)

如何實現通信:

1.建立好底層的物理連接介質

2.有一套統一的通信標準,稱之為互聯網協議

1.osi七層協議

互聯網協議按照功能的不同分為osi七層或tcp/ip五層或tcp/ip四層

每層運行的常見物理設備

2.tcp/ip五層協議模型講解

2.1物理層:主要是基于電器特性發(fā)送高低電壓(電信號),高電壓對應數字1,低電壓對應數字0

2.2數據鏈路層:定義了電信號的分組方式,由于單純的0和1并沒有任何意義,必須規(guī)定電信號多少位一組,每組什么意思

以太網協議:

早期每個公司都有自己的分組方式,后來形成統一的標準,即以太網協議Ethernet

Ethernet規(guī)定

1.一組電信號構成一個數據包,叫做‘幀’,每一數據幀分成:報頭head和數據data兩部分

2.報頭(head):固定字節(jié)數,里面包含發(fā)送者,接收者,數據類型。數據(data):數據包的具體內容

mac地址

head中包含的源和目標地址的由來:以太網規(guī)定接入internet的設備都必須具備網卡,發(fā)送地址和接收地址都是通過網卡來的

每塊網卡出廠時都被燒制上一個唯一的mac地址,前6位是廠商編號,后6位是流水線號

廣播:

有了mac地址,同一網絡內的兩臺計算機就可以通信了

2.3網絡層:不同網絡內想要通信,光靠Ethernet、mac地址和廣播并不可行,所以引入一套新的地址用來區(qū)分不同的網絡,這套地址就叫網絡地址

ip協議:

規(guī)定網絡地址的協議叫ip協議,它定義的地址稱為ip地址,廣泛采用v4版本即ipv4,它規(guī)定網絡地址由32位2進制表示

范圍為0.0.0.0 ---255.255.255.255

ip地址分為兩部分

網絡部分:標識子網

主機部分:標識主機

子網掩碼:

形式上等同于ip地址,也是32位二進制,網絡部分全部為1,主機部分全為0。

知道子網掩碼我們就能判斷,任意兩個ip地址是否處在同一個子網絡。方法是將兩個ip地址分別進行AND運算(兩個都為1運算結果為1,否則為0),比較結果是否相同,如果相同的話就表明他們是在一個子網絡中,否則就不是

總結ip協議的作用:1.為每臺計算機分配ip地址,2確定這些地址是不是在同一個子網絡中。

ARP協議

廣播的方式發(fā)送數據包,獲取目標主機的mac地址

2.4傳輸層:網絡層的ip幫我們區(qū)分子網,以太網層的mac幫我們找到主機,傳輸層建立端口到端口的通信,端口就是應用程序與網關關聯的編號? ?端口范圍0-65535,? 0-1023位系統占用端口

tcp協議:可靠傳輸,tcp數據包沒有長度限制,必須等到有回應才會繼續(xù)發(fā)送

udp協議:不可靠傳輸,不管有沒有收到響應只管發(fā)送

tcp的三次握手

注:TCP的TIME_WAIT需要等待2MSL,當TCP的一端發(fā)起主動關閉,三次揮手完成后發(fā)送第四次揮手的ACK包后就進入這個狀態(tài),等待2MSL時間主要目的是:防止最后一個ACK包對方沒有收到,那么對方在超時后將重發(fā)第三次握手的FIN包,主動關閉端接到重發(fā)的FIN包后可以再發(fā)一個ACK應答包。在TIME_WAIT狀態(tài)時兩端的端口不能使用,要等到2MSL時間結束才可以繼續(xù)使用。當連接處于2MSL等待階段時任何遲到的報文段都將被丟棄。MSL即Maximum Segment Lifetime,就是最大報文生存時間,是任何報文在網絡上的存在的最長時間,超過這個時間報文將被丟棄。

常見面試題:為什么建立鏈接是三次握手,不是二次,四次,關閉鏈接卻是四次不是其它

這是因為服務端在LISTEN狀態(tài)下,收到建立連接請求的SYN報文后,把ACK和SYN放在一個報文里發(fā)送給客戶端。而關閉連接時,當收到對方的FIN報文時,僅僅表示對方不再發(fā)送數據了但是還能接收數據,己方也未必全部數據都發(fā)送給對方了,所以己方可以立即close,也可以發(fā)送一些數據給對方后,再發(fā)送FIN報文給對方來表示同意現在關閉連接,因此,己方ACK和FIN一般都會分開發(fā)送。

2.5應用層:規(guī)定應用程序的數據格式

二、socket介紹

socket是應用層與tcp/ip協議通信的中間軟件抽象層,它是一組接口,它吧復雜的TCP/IP協議隱藏在socket接口后面。

基于文件類型的套接字家族:

套接字家族的名字:AF_UNIX

unix一切皆文件,基于文件的套接字調用的就是底層的文件系統來取數據,兩個套接字進程運行在同一機器,可以通過訪問同一個文件系統間接完成通信

基于網絡類型的套接字家族:

套接字家族的名字:AF_INET

AF_INET被用于ipv4,AF_INET6被用于ipv6

三、套接字使用

importsocket

socket.socket(socket_family,socket_type,protocal=0)

socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,默認值為 0。

獲取tcp/ip套接字

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

獲取udp/ip套接字

udpSock=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

由于 socket 模塊中有太多的屬性。我們在這里破例使用了'from module import *'語句。使用 'from socket import *',我們就把 socket 模塊里的所有屬性都帶到我們的命名空間里了,這樣能 大幅減短我們的代碼。

例如tcpSock= socket(AF_INET, SOCK_STREAM)

客戶端套接字函數

s.connect() 主動初始化TCP服務器連接

s.connect_ex() connect()函數的擴展版本,出錯時返回出錯碼,而不是拋出異常

公共用途的套接字函數

s.recv() 接收TCP數據

s.send() 發(fā)送TCP數據(send在待發(fā)送數據量大于己端緩存區(qū)剩余空間時,數據丟失,不會發(fā)完)

s.sendall() 發(fā)送完整的TCP數據(本質就是循環(huán)調用send,sendall在待發(fā)送數據量大于己端緩存區(qū)剩余空間時,數據不丟失,循環(huán)調用send直到發(fā)完)

s.recvfrom() 接收UDP數據

s.sendto() 發(fā)送UDP數據

s.getpeername() 連接到當前套接字的遠端的地址

s.getsockname() 當前套接字的地址

s.getsockopt() 返回指定套接字的參數

s.setsockopt() 設置指定套接字的參數

s.close() 關閉套接字

面向鎖的套接字方法

s.setblocking() 設置套接字的阻塞與非阻塞模式

s.settimeout() 設置阻塞套接字操作的超時時間

s.gettimeout() 得到阻塞套接字操作的超時時間

面向文件的套接字的函數

s.fileno() 套接字的文件描述符

s.makefile() 創(chuàng)建一個與該套接字相關的文件

基于tcp協議通信的套接字簡單

from socket importsocket, AF_INET, SOCK_STREAM#socket 套接字#AF_INET IPv4#SOCK_STREAM socket流

IP = "127.0.0.1"PORT= 8888ADDRESS=(IP, PORT)

BUFSIZE= 1024

print("服務器開啟了")#1.創(chuàng)建服務器socket對象

serSocket =socket(AF_INET, SOCK_STREAM)#2.設置服務器地址

serSocket.bind(ADDRESS)#3.設置連接管理隊列

serSocket.listen(5)#4.建立客戶端服務器連接

cliSocket, addr =serSocket.accept()print(cliSocket)print(addr)#5.收發(fā)數據

data =cliSocket.recv(BUFSIZE)print(data.decode("utf-8"))

cliSocket.send("服務器返回的數據".encode("utf-8"))#6.斷開客戶端

cliSocket.close()#7.關閉服務器

serSocket.close()print("服務器關閉了")

server

from socket importsocket, AF_INET, SOCK_STREAM

IP= "127.0.0.1"PORT= 8888ADDRESS=(IP, PORT)

BUFSIZE= 1024

print("客戶端開啟了")#1.創(chuàng)建客戶端socket對象

cliSocket =socket(AF_INET, SOCK_STREAM)#2.連接服務器地址

cliSocket.connect(ADDRESS)print(cliSocket)#3.收發(fā)數據

cliSocket.send("客戶端發(fā)送的數據".encode("utf-8"))

data=cliSocket.recv(BUFSIZE)print(data.decode("utf-8"))#4.關閉客戶端

cliSocket.close()print("客戶端關閉了")

client

總結

以上是生活随笔為你收集整理的python socket编程步骤_python-socket编程(入门,网络基础)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。