【python學習】中級篇-TCP編程Socket模塊:客戶端與服務端

客戶端

  1. 創建一個基于TCP連接的Socket
    AF_INET指定使用IPv4協議
    AF_INET6指定使用IPv6協議
# 導入socket庫:
import socket# 創建一個socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立連接:
s.connect(('www.sina.com.cn', 80))
  1. 客戶端要主動發起TCP連接
    必須知道服務器的IP地址和端口號
    連接新浪服務器
# 連接服務器
s.connect(('www.sina.com.cn', 80))

服務都有對應的標準端口號,
Web服務是80端口,
SMTP服務是25端口,
FTP服務是21端口,
端口號小于1024的是Internet標準服務的端口,
端口號大于1024的,可以任意使用。

  1. 建立TCP連接后,發送請求
# 發送數據:
s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')
  1. 接收數據
# 接收數據:
buffer = []
while True:# 每次最多接收1k字節:d = s.recv(1024)if d:buffer.append(d)else:break
data = b''.join(buffer)

接收數據時,調用recv(max)方法,一次最多接收指定的字節數,
因此,在一個while循環中反復接收,直到recv()返回空數據,表示接收完畢,退出循環。

接收到的數據包括HTTP頭和網頁本身,我們只需要把HTTP頭和網頁分離一下,
把HTTP頭打印出來,網頁內容保存到文件:

header, html = data.split(b'\r\n\r\n', 1)
print(header.decode('utf-8'))
# 把接收的數據寫入文件:
with open('sina.html', 'wb') as f:f.write(html)

在瀏覽器中打開這個sina.html文件,就可以看到新浪的首頁了。
5.關閉Socket,通信結束

# 關閉連接:
s.close()

服務器端

服務器進程首先要綁定一個端口并監聽來自其他客戶端的連接。
如果某個客戶端連接過來了,服務器就與該客戶端建立Socket連接,隨后的通信就靠這個Socket連接了。
一個Socket依賴4項:服務器地址、服務器端口、客戶端地址、客戶端端口來唯一確定一個Socket。

編寫一個簡單的服務器程序,它接收客戶端連接,把客戶端發過來的字符串加上Hello再發回去

  1. 創建一個基于IPv4和TCP協議的Socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  1. 綁定監聽的地址和端口
    用0.0.0.0綁定到所有的網絡地址,還可以用127.0.0.1綁定到本機地址。
    127.0.0.1是一個特殊的IP地址,表示本機地址,如果綁定到這個地址,客戶端必須同時在本機運行才能連接
# 綁定端口:
s.bind(('127.0.0.1', 9999))
  1. 監聽端口
    傳入的參數指定等待連接的最大數量
s.listen(5)
print('Waiting for connection...')
  1. 接受客戶端連接
    服務器程序通過一個永久循環來接受來自客戶端的連接
while True:# 接受一個新連接:sock, addr = s.accept()# 創建新線程來處理TCP連接:t = threading.Thread(target=tcplink, args=(sock, addr))t.start()
  1. 多進程接受連接
    每個連接都必須創建新線程(或進程)來處理,否則,單線程在處理連接的過程中,無法接受其他客戶端的連接
    連接建立后,服務器首先發一條歡迎消息,然后等待客戶端數據,并加上Hello再發送給客戶端。如果客戶端發送了exit字符串,就直接關閉連接
def tcplink(sock, addr):print('Accept new connection from %s:%s...' % addr)sock.send(b'Welcome!')while True:data = sock.recv(1024)time.sleep(1)if not data or data.decode('utf-8') == 'exit':breaksock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))sock.close()print('Connection from %s:%s closed.' % addr)
  1. 退出服務器程序
    服務器程序會永遠運行下去,必須按Ctrl+C退出程序。

  2. 測試所需的客戶端程序:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立連接:
s.connect(('127.0.0.1', 9999))
# 接收歡迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Sarah']:# 發送數據:s.send(data)print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/162976.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162976.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162976.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2022-1-25 機器人運動規劃方法綜述 航空學報

論文PDF abstract 隨著應用場景的日益復雜,機器人對旨在生成無碰撞路徑(軌跡)的自主運動規劃技術的需求也變得更加迫 切。雖然目前已產生了大量適應于不同場景的規劃算法,但如何妥善地對現有成果進行歸類,并分析不同…

Spark---基于Standalone模式提交任務

Standalone模式兩種提交任務方式 一、Standalone-client提交任務方式 1、提交命令 ./spark-submit --master spark://mynode1:7077 --class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 100 或者 ./spark-submit --master spark…

給數據庫查詢結果添加一個額外的自增編號

1、在mysql數據庫可以執行的sql SELECT( i : i 1 ) num,M.* FROMuser M,( SELECT i : 0 ) AS ID GROUP BYM.ID ORDER BYM.create_time SELECT (i :i 1) 是為了生成自增的序列號字段 SELECT i : 0 是為了將i進行初始化每次查詢的序列號都會從1開始進行排序生成序列號 在…

go sync.map源碼解讀

此源碼理解僅為個人理解,如有錯誤歡迎指出 sync.map的數據結構主要包含四個字段 一個互斥鎖,readonly,dirty,和miss 從讀寫兩個方面來講這幾個變量 readonly其實就是有bool值的dirty,底層結構都是map readonly的讀更新不會上鎖&#xff0c…

在springboot中實現WebSocket協議通信

前面介紹了使用netty實現websocket通信,有些時候,如果我們的服務并不復雜或者連接數并不高,單獨搭建一個websocket服務端有些浪費資源,這時候我們就可以在web服務內提供簡單的websocket連接支持。其實springboot已經支持了websock…

20230511 Windows Ubuntu vscode remote-ssh 連接配置

參考 : VSCode SSH 連接遠程ubuntu Linux 主機 VSCode通過Remote SSH擴展連接到內網Ubuntu主機 Ubuntu 安裝 sudo apt-get install openssh-server vscode: 安裝remote-ssh 插件 連接到服務器IP 免密登錄的公鑰密鑰傳遞用filezillaUbuntu 和 Windows 文件互傳 …

PMP對項目工程師有用嗎?

一、什么是項目工程師? 項目工程師是指在各個領域負責技術操作、設計、管理以及評估能力的人員。他們通常擔當項目的實施和執行角色,在開發或控制類項目中發揮重要作用。有時,項目工程師的稱號還可以用來表示在某個領域取得專業資格的人員。…

深入理解路由協議:從概念到實踐

路由技術是Internet得以持續運轉的關鍵所在,路由是極其有趣而又復雜的課題,永遠的話題。 SO:這是一個解析路由協議的基礎文章。 目錄 前言路由的概念路由協議的分類數據包在網絡中的路由過程理解路由表的結構路由器關鍵功能解析 前言 在互聯…

PTA-字符串的連接

本題要求實現一個函數&#xff0c;將兩個字符串連接起來。 函數接口定義&#xff1a; char *str_cat( char *s, char *t ); 函數str_cat應將字符串t復制到字符串s的末端&#xff0c;并且返回字符串s的首地址。 裁判測試程序樣例&#xff1a; #include <stdio.h> #inc…

SQL Server數據庫自動備份方法

要編寫一個自動備份 SQL Server 數據庫的腳本&#xff0c;可以使用 SQL Server Management Studio (SSMS) 或者 Transact-SQL (T-SQL) 腳本。以下是一個簡單的 T-SQL 腳本示例&#xff0c;該腳本將數據庫備份到指定的文件路徑&#xff1a; -- 設置要備份的數據庫名稱 DECLARE D…

求解Beamforming-SOCP(CVX求解)

時間&#xff1a;2023年11月23日14:00:16&#xff1a; 直接上代碼&#xff08;辛苦兩天才改出來的&#xff09; clear all; K 4; %user number N4; %base station number var1e-9; H []; %initialize H matrix for i1:Kh 1/sqrt(2*K)*mvnrnd(zeros(N,1),eye(N),1)1i/sqrt(2*…

【C++】泛型編程 ? ( 類模板 static 關鍵字 | 類模板 static 靜態成員 | 類模板使用流程 )

文章目錄 一、類模板使用流程1、類模板 定義流程2、類模板 使用3、類模板 函數 外部實現 二、類模板 static 關鍵字1、類模板 static 靜態成員2、類模板 static 關鍵字 用法3、完整代碼示例 將 類模板 函數聲明 與 函數實現 分開進行編碼 , 有 三種 方式 : 類模板 的 函數聲明…

數據結構 二叉樹

二叉樹 二叉樹是n個有限元素的集合&#xff0c;該集合或者為空、或者由一個稱為根&#xff08;root&#xff09;的元素及兩個不相交的、被分別稱為左子樹和右子樹的二叉樹組成&#xff0c;是有序樹。當集合為空時&#xff0c;稱該二叉樹為空二叉樹。在二叉樹中&#xff0c;一個…

【8】Spring Boot 3 集成組件:安全組件 spring security【官網概念篇】

目錄 【8】Spring Boot 3 集成組件&#xff1a;安全組件 spring securitySpring Security 簡介先決條件引入依賴身份驗證密碼存儲密碼存儲歷史DelegatingPasswordEncoder密碼存儲格式密碼加解密類自定義密碼存儲 體系結構 ArchitectureServlet 過濾器DelegatingFilterProxyFilt…

第二十章 多線程

20.2創建線程 20.2.1繼承Thread類 Thread類是Java.lang包中的一個類&#xff0c;從這個類中實例化的對象代表線程&#xff0c;程序員啟動一個新線程需要建議Thread實例。 public class ThreadTest extedns Thread{} run方法格式&#xff1a; public void run(){} 20.1讓線程循…

mysql命令導出表結構和數據

MySQL是一款流行的關系型數據庫管理系統&#xff0c;是許多公司和組織使用的首選數據庫。在日常使用中&#xff0c;我們經常需要對數據庫進行備份和復制&#xff0c;因此必須了解如何導出表結構和表數據。以下是使用MySQL命令導出表結構和表數據的方法。 1. 導出表結構 mysql…

AnalyticDB for PostgreSQL 實時數據倉庫上手指南

AnalyticDB for PostgreSQL 實時數據倉庫上手指南 2019-04-016601 版權 本文涉及的產品 云原生數據倉庫 ADB PostgreSQL&#xff0c;4核16G 50GB 1個月 推薦場景&#xff1a; 構建的企業專屬Chatbot 立即試用 簡介&#xff1a; AnalyticDB for PostgreSQL 提供企業級數…

iOS合并代碼后解決沖突

合并主干和分支代碼后有沖突&#xff0c;xcode無法運行&#xff0c;如下圖&#xff1a;文件顯示不了&#xff0c;項目名也顯示不了 解決沖突&#xff1a; 1.選中左邊目錄欄的項目名。鼠標右鍵--> Show in Finder 2.選中項目文件 xxxx.xcodeproj。鼠標右鍵--> 顯示包內容…

【python學習】中級篇-繪制圖形:turtle庫

turtle庫是Python的一個繪圖庫&#xff0c;它提供了一個簡單的繪圖窗口&#xff0c;可以讓你通過控制一個小海龜在屏幕上移動來繪制圖形。 以下是一個簡單的turtle庫用法示例&#xff1a; 在這個示例中&#xff0c;我們首先導入了turtle庫&#xff0c;然后創建了一個畫布和一個…

【創建一個C++線程需要傳入幾個參數?】

在C++中,創建一個std::thread對象時,你可以傳遞多個參數,但至少需要一個參數:線程將要執行的函數。這個函數可以是一個普通函數、一個類的成員函數,或者一個可調用對象(如lambda表達式)。除了要執行的函數之外,你還可以傳遞任何數量的參數,這些參數將被轉發到線程函數…