天天看點

Python學習十:網絡程式設計

文章目錄

  • ​​一、網絡基礎​​
  • ​​1.1 為什麼要使用通信協定​​
  • ​​1.2 TCP/IP 簡介​​
  • ​​1.3 UDP 簡介​​
  • ​​1.4 Socket 簡介​​
  • ​​1.41 Python 使用​​
  • ​​二、TCP 程式設計​​
  • ​​2.1 建立TCP伺服器​​
  • ​​2.2 建立TCP用戶端​​
  • ​​2.3 執行TCP伺服器和用戶端​​
  • ​​三、UDP程式設計​​
  • ​​3.1 服務端​​
  • ​​3.2 用戶端​​

一、網絡基礎

1.1 為什麼要使用通信協定

為了把全世界的所有不同類型的計算機都連起來,就必須規定一套全球通用協定,為了實作網際網路這個目标。

1.2 TCP/IP 簡介

Python學習十:網絡程式設計

1.3 UDP 簡介

相對于TCP,UDP是面向無條件連接配接的協定,速度更快,但是不可靠。

  1. 為了在給定的主機上能識别多個目的位址,同時允許多個應用程式在同一台主機上工作并能獨立地進行資料包的發送和接收,設計使用者資料報協定UDP。
  2. UDP使用底層的網際網路協定來傳送封包,同IP一樣提供不可靠的無連接配接資料包傳輸服務。它不提供封包到達确認、排序、及流量控制等功能。
  3. UDP Helper可以實作對指定UDP端口廣播封包的中繼轉發,即将指定UDP端口的廣播封包轉換為單點傳播封包發送給指定的伺服器,起到中繼的作用。

1.4 Socket 簡介

所謂Socket就是套接字,套接字就是對網絡中不同主機上的應用程序之間進行雙向通信的端點的抽象。

一個套接字就是網絡上程序通信的一端,提供了應用層程序利用網絡協定交換資料的機制。從所處的地位來講,套接字上聯應用程序,下聯網絡協定棧,是應用程式通過網絡協定進行通信的接口,是應用程式與網絡協定根進行互動的接口

Python學習十:網絡程式設計

1.41 Python 使用

​s=socket.socket(AddressFamily,type)​

  1. AddressFamily:可以選擇AF_INET(用于Internet 程序間通訊),或者使用AF_UNIX(用于同一台機器之間通信),實際工作用AF_INET
  2. Type:嵌套字類型,可以使SOCK_STREAM(流式嵌套字,主要用于TCP協定),或者使用SOCK_DGRAM(資料報套接字,主要用于UDP協定)

例如,為了建立TCP/IP套接字,可以使用如下方法調用socket.socket()

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

為了建立UDP/IP套接字,可以使用如下方法調用socket.socket()

udpSock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)      
Python學習十:網絡程式設計
Python學習十:網絡程式設計
Python學習十:網絡程式設計

二、TCP 程式設計

2.1 建立TCP伺服器

#建立一個TCP伺服器
  ss = socket()    #建立伺服器套接字
  ss.bind()           #把位址綁定到套接字上
  ss.listen()         #監聽連接配接
  inf_loop:           #伺服器無線循環
      cone,addr = ss.accept()    #接收用戶端連接配接
  comm_loop:      #通信循環
      cone.recv()/cs.send()    #對話(接受與發送)
  cone.close()      #關閉用戶端套接字
ss.close()          #關閉伺服器套接字(可選)      

eg:

# -*- coding:utf-8 -*-
import socket               #導入socket子產品
host = '127.0.0.1'          #主機IP
port = 8080                     #端口号
web = socket.socket()           #建立 socket 對象
web.bind((host,port))       #綁定端口
web.listen(5)               #設定最多連接配接數
print ('伺服器等待用戶端連接配接...') 
#開啟死循環
while True:
    conn,addr = web.accept()    #建立用戶端連接配接
    data = conn.recv(1024).decode()      #擷取用戶端請求資料
    print(data)             #列印接受資料
    conn.sendall(b'HTTP/1.1 200 OK\r\n\r\nHello World')     #向用戶端發送資料
    conn.close()            #關閉連結 
>>>

伺服器等待用戶端連接配接...      

2.2 建立TCP用戶端

import socket       # 導入socket子產品
s= socket.socket()  # 建立TCP/IP套接字
host = '127.0.0.1'  # 擷取主機位址
port = 8080        # 設定端口号
s.connect((host,port)) # 主動初始化TCP伺服器連接配接

send_data = input("請輸入要發送的資料:") # 提示使用者輸入資料
s.send(send_data.encode()) # 發送TCP資料

# 接收對方發送過來的資料,最大接收1024個位元組
recvData = s.recv(1024).decode()
print('接收到的資料為:',recvData)

# 關閉套接字
s.close()
>>>
用戶端控制台:
請輸入要發送的資料:123
接收到的資料為: HTTP/1.1 200 OK
Hello World

服務端控制台:
伺服器等待用戶端連接配接...
123      

2.3 執行TCP伺服器和用戶端

import socket               # 導入socket子產品
host = socket.gethostname() # 擷取主機位址
port = 12345                # 設定端口号   
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #建立TCP/IP套接字
s.bind((host,port)) # 綁定位址(host,port)到套接字
s.listen(1) # 設定最多連接配接數量
sock,addr = s.accept() # 被動接受TCP用戶端連接配接
print('連接配接已經建立') 
info = sock.recv(1024).decode() # 接收用戶端資料
while info != 'byebye':  # 判斷是否退出
  if info :
    print('接收到的内容:'+info)
  send_data = input('輸入發送内容:')   # 發送消息
  sock.send(send_data.encode()) # 發送TCP資料
  if send_data =='byebye':  # 如果發送exit,則退出
    break
  info = sock.recv(1024).decode() # 接收用戶端資料
sock.close() # 關閉用戶端套接字
s.close()    # 關閉伺服器端套接字      
import socket       # 導入socket子產品
s= socket.socket()  # 建立TCP/IP套接字
host = socket.gethostname() # 擷取主機位址
port = 12345        # 設定端口号     
s.connect((host,port)) # 主動初始化TCP伺服器連接配接
print('已連接配接')
info = ''           
while info != 'byebye':  # 判斷是否退出
  send_data=input('輸入發送内容:')    # 輸入内容
  s.send(send_data.encode()) # 發送TCP資料
  if send_data =='byebye': # 判斷是否退出
    break
  info = s.recv(1024).decode() # 接收伺服器端資料
  print('接收到的内容:'+info)
s.close() # 關閉套接字      

三、UDP程式設計

3.1 服務端

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #建立UDP套接字
s.bind(('127.0.0.1', 8888)) # 綁定位址(host,port)到套接字
print('綁定UDP到8888端口')
# 接收資料:
data, addr = s.recvfrom(1024)
data = float(data)*1.8 + 32 # 轉化公式
send_data = '轉換後的溫度(機關:華氏溫度):'+str(data)
print('Received from %s:%s.' % addr)
s.sendto(send_data.encode(), addr) # 發送給用戶端
s.close()    # 關閉伺服器端套接字      

3.2 用戶端

import socket # 導入socket子產品

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)        #建立UDP套接字
data = input('請輸入要轉換的溫度(機關:設定度):')     #輸入要轉化的溫度
s.sendto(data.encode(), ('127.0.0.1', 8888))               # 發送資料
print(s.recv(1024).decode()) # 列印接收資料:
s.close() # 關閉套接字