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

歡迎訪問 生活随笔!

生活随笔

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

python

python可以用来编写计算机网络程序吗_计算机网络(基于python做的笔记 )

發布時間:2023/12/2 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python可以用来编写计算机网络程序吗_计算机网络(基于python做的笔记 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

計算機網絡(UDP 和 TCP)

概述

為了讓在不同的電腦上運行的軟件,之間能夠互相傳遞數據,就需要借助網絡的功能

使用網絡能夠把多方鏈接在一起,然后可以進行數據傳遞

所謂的網絡編程就是,讓在不同的電腦上的軟件能夠進行數據傳遞,即進程之間的通信

IP地址

IP地址的作用

用在網絡中標記一臺電腦,比如:192.168.1.1,在本地局域網上是唯一的。

IP地址的分類

每一個IP地址包括兩部分:網絡地址和主機地址

IP地址的查看

linux系統: 終端輸入ifconfig win:ipconfig

測試遠程主機連通性: ping + IP地址

端口

如果一個程序需要收發網絡數據,那么就需要有端口

端口號

端口是通過端口號來標記的,端口號只有整數,范圍是從0到65535

端口分類

** 知名端口(Well Known Ports)

知名端口是眾所周知的端口號,范圍從0到1023

80端口分配給HTTP服務

21端口分配給FTP服務

** 動態端口(Dynamic Ports)

動態端口的范圍是從1024到65535

之所以稱為動態端口,是因為它一般不固定分配某種服務,而是動態分配。

動態分配是指當一個系統程序或應用程序程序需要網絡通信時,它向主機申請一個端口,主機從可用的端口號中分配一個供它使用。

當程序關了的時候,端口號也就釋放了

socket 簡介

“協議+端口”可以唯一標識主機中的應用進程(進程)。

socket(簡稱 套接字) 是進程間通信的一種方式,它與其他進程間通信的一個主要不同是:

它能實現不同主機間的進程間通信,我們網絡上各種各樣的服務大多都是基于 Socket 來完成通信的

創建socket

import socket

socket.socket(AddressFamily, Type)

Address Family : 可以選擇 AF_INET(用于 Internet 進程間通信) 或者 AF_UNIX(用于同一臺機器進程間通信),實際工作中常用AF_INET

Type:套接字類型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 協議)或者 SOCK_DGRAM(數據報套接字,主要用于 UDP 協議)

創建一個tcp socket(tcp套接字)

import socket

# 創建tcp的套接字

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

# ...這里是使用套接字的功能(省略)...

# 不用的時候,關閉套接字

s.close()

創建一個udp socket(udp套接字)

import socket

# 創建udp的套接字

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

# ...這里是使用套接字的功能(省略)...

# 不用的時候,關閉套接字

s.close()

UDP

創建一個基于udp的網絡程序流程很簡單,具體步驟如下:

1、創建客戶端套接字

2、發送/接收數據

3、關閉套接字

udp 聊天器

import socket

def send_msg(udp_socket):

"""獲取鍵盤數據,并將其發送給對方"""

# 1. 從鍵盤輸入數據

msg = input("\n請輸入要發送的數據:")

# 2. 輸入對方的ip地址

dest_ip = input("\n請輸入對方的ip地址:")

# 3. 輸入對方的port

dest_port = int(input("\n請輸入對方的port:"))

# 4. 發送數據

udp_socket.sendto(msg.encode("utf-8"), (dest_ip, dest_port))

def recv_msg(udp_socket):

"""接收數據并顯示"""

# 1. 接收數據

recv_msg = udp_socket.recvfrom(1024)

# 2. 解碼

recv_ip = recv_msg[1]

recv_msg = recv_msg[0].decode("utf-8")

# 3. 顯示接收到的數據

print(">>>%s:%s" % (str(recv_ip), recv_msg))

def main():

# 1. 創建套接字

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

# 2. 綁定本地信息

udp_socket.bind(("", 7890))

while True:

# 3. 選擇功能

print("="*30)

print("1:發送消息")

print("2:接收消息")

print("="*30)

op_num = input("請輸入要操作的功能序號:")

# 4. 根據選擇調用相應的函數

if op_num == "1":

send_msg(udp_socket)

elif op_num == "2":

recv_msg(udp_socket)

else:

print("輸入有誤,請重新輸入...")

if __name__ == "__main__":

main()

TCP

TCP協議,傳輸控制協議(英語:Transmission Control Protocol,縮寫為 TCP)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議,由IETF的RFC 793定義。

TCP特點

1、面向連接

通信雙方必須先建立連接才能進行數據的傳輸,雙方都必須為該連接分配必要的系統內核資源,以管理連接的狀態和連接上的傳輸。

雙方間的數據傳輸都可以通過這一個連接進行。

完成數據交換后,雙方必須斷開此連接,以釋放系統資源。

連接是一對一的,因此TCP不適用于廣播的應用程序,基于廣播的應用程序請使用UDP協議。

2、可靠傳輸

1)TCP采用發送應答機制

TCP發送的每個報文段都必須得到接收方的應答才認為這個TCP報文段傳輸成功

2)超時重傳

發送端發出一個報文段之后就啟動定時器,如果在定時時間內沒有收到應答就重新發送這個報文段。

TCP為了保證不發生丟包,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然后接收端實體對已成功收到的包發回一個相應的確認(ACK);如果發送端實體在合理的往返時延(RTT)內未收到確認,那么對應的數據包就被假設為已丟失將會被進行重傳。

3)錯誤校驗

TCP用一個校驗和函數來檢驗數據是否有錯誤;在發送和接收時都要計算校驗和。

4) 流量控制和阻塞管理

流量控制用來避免主機發送得過快而使接收方來不及完全收下。

TCP通信模型

文件下載器

from socket import *

import sys

def get_file_content(file_name):

"""獲取文件的內容"""

try:

with open(file_name, "rb") as f:

content = f.read()

return content

except:

print("沒有下載的文件:%s" % file_name)

def main():

if len(sys.argv) != 2:

print("請按照如下方式運行:python3 xxx.py 7890")

return

else:

# 運行方式為python3 xxx.py 7890

port = int(sys.argv[1])

# 創建socket

tcp_server_socket = socket(AF_INET, SOCK_STREAM)

# 本地信息

address = ('', port)

# 綁定本地信息

tcp_server_socket.bind(address)

# 將主動套接字變為被動套接字

tcp_server_socket.listen(128)

while True:

# 等待客戶端的鏈接,即為這個客戶端發送文件

client_socket, clientAddr = tcp_server_socket.accept()

# 接收對方發送過來的數據

recv_data = client_socket.recv(1024) # 接收1024個字節

file_name = recv_data.decode("utf-8")

print("對方請求下載的文件名為:%s" % file_name)

file_content = get_file_content(file_name)

# 發送文件的數據給客戶端

# 因為獲取打開文件時是以rb方式打開,所以file_content中的數據已經是二進制的格式,因此不需要encode編碼

if file_content:

client_socket.send(file_content)

# 關閉這個套接字

client_socket.close()

# 關閉監聽套接字

tcp_server_socket.close()

if __name__ == "__main__":

main()

客戶端 參考代碼如下:

from socket import *

def main():

# 創建socket

tcp_client_socket = socket(AF_INET, SOCK_STREAM)

# 目的信息

server_ip = input("請輸入服務器ip:")

server_port = int(input("請輸入服務器port:"))

# 鏈接服務器

tcp_client_socket.connect((server_ip, server_port))

# 輸入需要下載的文件名

file_name = input("請輸入要下載的文件名:")

# 發送文件下載請求

tcp_client_socket.send(file_name.encode("utf-8"))

# 接收對方發送過來的數據,最大接收1024個字節(1K)

recv_data = tcp_client_socket.recv(1024)

# print('接收到的數據為:', recv_data.decode('utf-8'))

# 如果接收到數據再創建文件,否則不創建

if recv_data:

with open("[接收]"+file_name, "wb") as f:

f.write(recv_data)

# 關閉套接字

tcp_client_socket.close()

if __name__ == "__main__":

main()

標簽:udp,socket,python,筆記,計算機網絡,TCP,file,接字,recv

總結

以上是生活随笔為你收集整理的python可以用来编写计算机网络程序吗_计算机网络(基于python做的笔记 )的全部內容,希望文章能夠幫你解決所遇到的問題。

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