python网络编程(苦肝一夜,近万字)
文章目錄
- 一、TCP/IP簡介
- 二、網絡設計模塊
- 1.Socket簡介
- 2、python中的socket模塊,使用該模塊建立服務器需要6個步驟。
- 1.創建socket對象。
- 2.將socket綁定(指派)到指定地址上。
- 3.綁定后必須準備好套接字,以便接收連接。
- 4.服務器套接字通過socket的accept 方法等待客戶請求一個連接。
- 5.處理階段,服務器和客戶通過send和reext方法通信(傳輸數據)。
- 6.傳輸結束,服務器調用socket的close方法以關閉連接。
- 代碼案列
- 3、python中的socket模塊,使用該模塊建立客戶連接需要4個步驟。
- 如何知道服務器端口
- 客戶端。
- 公共用途。
提示:以下是本篇文章正文內容,下面案例可供參考
一、TCP/IP簡介
通信雙方必須知道對方的標識?;ヂ摼W上計算機的唯一標識就是IP地址。通常是網卡。
IP 協議負責把數據從一臺計算機通過網絡發送到另一臺計算機上。數據被分割成一小塊,然后通過IP包發送過去。 IP包的特點是按快發送,途徑多個路由,但不保證能到達,也不保證順利到達。
IP地址實際上是一個32位整數(IPv4),以字符串表示的IP地址實際上是把32位整數按8位分組后的數字表示(如192.165.0.1),目的是便于閱讀。
TCP協議是建立在IP協議之上的,TCP協議負責在兩臺計算機之間建立可靠連接,保證數據順利到達。
一個IP包除了包含傳輸的數據外,還包含源IP地址和目標IP地址,源端口和目標端口。 而端口的作用是區分送過來的IP包是給那個程序的。
二、網絡設計模塊
1.Socket簡介
網絡編程中有一個基本組件----套接字(socket)
套接字為特定的網絡協議(如TCP/IP,UDP/IP)套件對上的網絡應用程序提供當前可移植標準的對象。套接字允許程序接收數據并進行連接,為了建立通信通道,網絡通信的每個端點擁有一個套接字對象級為重要。
2、python中的socket模塊,使用該模塊建立服務器需要6個步驟。
1.創建socket對象。
該處使用socket()函數來創建套接字。
語法格式
- family :可以是AF_UNIX(用于同一臺機器上的進程間通信),也可以是AF_INET(對于IPV4協議的TCP和UDP),或AF_INET6(用于TPV6)
- type:套接字類型可以根據面向連接和非連接分為SOCK_STREAM(流套接字)或 SOCK_DGRAM(非流套接字)。
- protoco:一般不填,默認為0.
2.將socket綁定(指派)到指定地址上。
socket.bind(address)address 必須是一個雙元素元組。參數為主機名或ip地址加端口。
3.綁定后必須準備好套接字,以便接收連接。
請求方式如下:
socket.listen(backlog)backlog 用于指定最多連接數,至少為一。接到連接請求后,這些請求必須排隊,如果已滿,就拒絕請求。
4.服務器套接字通過socket的accept 方法等待客戶請求一個連接。
調用accept方法時,socket會進入等待(或阻塞)狀態??蛻粽埱筮B接時,accept方法建立連接并返回服務器。accept方法返回一個含有兩個元素的元組,如(connection,address)。第一個元素(connection)是新的socket對象,服務器通過它與客戶通信;第二個元素(address)是客戶的互聯網地址。
5.處理階段,服務器和客戶通過send和reext方法通信(傳輸數據)。
服務器調用send,并采用字符串形式向客戶發送信息。send方法返回已發送的字符個數。服務器使用recy方法從客戶接收信息。調用reev時,必須指定一個整數控制本次調用所接收的最大數據量。recy方法在接收數據時會進入blocket狀態,最后返回一個字符串,用于表示收到的數據。如果發送的量超過recy允許的量,數據就會被截斷。多余的數據將緩沖于接收端。以后調用recy時,多余的數據會從緩沖區刪除。
6.傳輸結束,服務器調用socket的close方法以關閉連接。
代碼案列
import socket #引入套接字模塊 #因為服務器需要同時響應多個客戶端的請求,每一個連接都需要一個進程或新線程#1處理,否則一次只能服務一個客戶 import threading #引入進程模塊 import time def socket_server():server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#步驟1host = socket.gethostname() #獲取本地主機名port = 5555 #端口號,0-1024 是標準的不能隨意使用,1025-9999 可以隨意#1使用server_socket.bind((host,port)) #參數必須是雙元素元組,步驟2server_socket.listen(5) #步驟3while True:#會返回一個含有兩個元素的元組。第一個元素是一個新的 socket 對象#服務器通過它與客戶端通信;第二個元素是客戶的互聯網地址sock,addr = server_socket.accept() #步驟4# threading.Thread(target =1,args =2)1 對于函數,2是該函數需要的參數t = threading.Thread(target = tcp_link,args = (sock,addr))t.start() def tcp_link(sock,addr):print('Accept new connection from %s:%s...'% addr)sock.send('歡迎學校 Python 網絡編程!'.encode('utf-8')) #send 發送數據 while True:data = sock.recv(1024) #recv 接收數據,最大為一個字節 1024time.sleep(1)if not data or data.decode('utf-8')=='exit':break;sock.send(("Hello,%s!"%data.decode('utf-8')).encode('utf-8'))sock.close()print('connection from %s:%s closed.'%addr)def main():socket_server()if __name__ =='__main__':main()3、python中的socket模塊,使用該模塊建立客戶連接需要4個步驟。
1.創建一個socket以連接服務器。socket=socket.socket(family,type)
2.使用socket 的connect 方法連接服務器。 socket.connect((hoat,port))
3.通過send()與recv()方法通信。
4.結束后,調用socket的close方法以關閉連接。
代碼案列:
import socketdef socket_client():s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)host = socket.gethostname()port = 5555s.connect((host,port)) #連接服務器,指定主機和端口print(s.recv(1024).decode('utf-8'))for data in ['小青','小白','小花']:s.send(data.encode('utf-8'))print(s.recv(1024).decode('utf-8'))s.send(b'exit')s.close()def main():socket_client()if __name__ =='__main__':main()如何知道服務器端口
1.域名可以自動轉換到IP地址。
2.作為服務器,提供服務時端口號必須固定下來。由于我們想要訪問網頁,因此新浪提供網頁服務的服務器必須把端口號固定在80端口。80端口是Web服務的標準端口。其他服務都有對應的標準端口號,如SMTP服務是25端口,FTP服務是21端口,等等。端口號小于1024的是Internet標準服務端口,端口號大于1024的可以任意使用,
## 4、socket 的一些套接字函數。 ### 服務器端。
| bind() | 綁定地址(host,port)到套接字, 在AF_INET下,以元組(host,port)的形式表示地址。 |
| listen() | 開始TCP監聽。backlog指定在拒絕連接之前,操作系統可以掛起的最大連接數量。該值至少為1,大部分應用程序設為5就可以了。 |
| accept() | 被動接受TCP客戶端連接,(阻塞式)等待連接的到來 |
客戶端。
| connect() | 主動初始化TCP服務器連接,。一般address的格式為元組(hostname,port),如果連接出錯,返回socket.error錯誤。 |
| connect_ex() | connect()函數的擴展版本,出錯時返回出錯碼,而不是拋出異常 |
公共用途。
| recv() | 接收TCP數據,數據以字符串形式返回,bufsize指定要接收的最大數據量。flag提供有關消息的其他信息,通常可以忽略。 |
| send() | 發送TCP數據,將string中的數據發送到連接的套接字。返回值是要發送的字節數量,該數量可能小于string的字節大小。 |
| sendall() | 完整發送TCP數據,完整發送TCP數據。將string中的數據發送到連接的套接字,但在返回之前會嘗試發送所有數據。成功返回None,失敗則拋出異常。 |
| recvfrom() | 接收UDP數據,與recv()類似,但返回值是(data,address)。其中data是包含接收數據的字符串,address是發送數據的套接字地址。 |
| sendto() | 發送UDP數據,將數據發送到套接字,address是形式為(ipaddr,port)的元組,指定遠程地址。返回值是發送的字節數。 |
| close() | 關閉套接字 |
| getpeername() | 返回連接套接字的遠程地址。返回值通常是元組(ipaddr,port)。 |
| getsockname() | 返回套接字自己的地址。通常是一個元組(ipaddr,port) |
| setsockopt(level,optname,value) | 設置給定套接字選項的值。 |
| getsockopt(level,optname[.buflen]) | 返回套接字選項的值。 |
| settimeout(timeout) | 設置套接字操作的超時期,timeout是一個浮點數,單位是秒。值為None表示沒有超時期。一般,超時期應該在剛創建套接字時設置,因為它們可能用于連接的操作(如connect()) |
| gettimeout() | 返回當前超時期的值,單位是秒,如果沒有設置超時期,則返回None。 |
| fileno() | 返回套接字的文件描述符。 |
| setblocking(flag) | 如果flag為0,則將套接字設為非阻塞模式,否則將套接字設為阻塞模式(默認值)。非阻塞模式下,如果調用recv()沒有發現任何數據,或send()調用無法立即發送數據,那么將引起socket.error異常。 |
| makefile() | 創建一個與該套接字相關連的文件 |
# SocketTool 編程調試工具 參考博文:[添加鏈接描述](https://blog.csdn.net/xuzhexing/article/details/90763756?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162717578716780274151128%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162717578716780274151128&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-90763756.first_rank_v2_pc_rank_v29&utm_term=python%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B&spm=1018.2226.3001.4187) 工具:SocketTool 1.下載鏈接: [添加鏈接描述](http://www.xitongzhijia.net/soft/110847.html) 也可以到百度上搜。
2.在左側有tcp和udp的客戶端或服務端的快捷按鈕,上方有【創建】【刪除】【退出】等選項按鈕。
4 我們先來建立TCP的測試服務端。點擊【TCP Server】再點擊【創建】。
選擇一個監聽端口,這里我們使用6001作為服務端的監聽端口。
建立完成后,服務端會自動啟動,軟件會顯示【啟動監聽】的狀態。
建立完成后,服務端會自動啟動,軟件會顯示【啟動監聽】的狀態。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
我們可以檢測一下本機的6001端口是否已經打開。在DOS窗口中輸入命令【netstat -a】,可以在列表中看到本機的6001端口的狀態為listening的狀態,表示本機的6001端口正處于監聽的狀態。
在DOS窗口中輸入命令【telnet 192.168.0.140 6001】來登錄本地的6001端口。 注意:192.168.0.140 6001 要根據軟件中本機的編號來寫。
window下 無法執行 telnet 命令的解決方法
1.打開設置中應用。
2.打開右上角的
3.
4.找到telnet 服務,勾選就好
點擊回車鍵,就可以成功登錄6001端口。在測試軟件中就可以看到狀態是已連接的狀態,同時也可以看到對方的ip就是本地ip。
在軟件的發送窗口中輸入1234567890,點擊發送后,在DOS窗口中就可以看到軟件發送過來的數據了。
若想發送中文不要勾選16進制。
總結
以上是生活随笔為你收集整理的python网络编程(苦肝一夜,近万字)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Python发送邮件
- 下一篇: 数论基础-小白学算法必学(一天一夜的成果