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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python网络编程(苦肝一夜,近万字)

發(fā)布時(shí)間:2025/3/19 python 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python网络编程(苦肝一夜,近万字) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、TCP/IP簡介
  • 二、網(wǎng)絡(luò)設(shè)計(jì)模塊
    • 1.Socket簡介
    • 2、python中的socket模塊,使用該模塊建立服務(wù)器需要6個步驟。
      • 1.創(chuàng)建socket對象。
      • 2.將socket綁定(指派)到指定地址上。
      • 3.綁定后必須準(zhǔn)備好套接字,以便接收連接。
      • 4.服務(wù)器套接字通過socket的accept 方法等待客戶請求一個連接。
      • 5.處理階段,服務(wù)器和客戶通過send和reext方法通信(傳輸數(shù)據(jù))。
      • 6.傳輸結(jié)束,服務(wù)器調(diào)用socket的close方法以關(guān)閉連接。
      • 代碼案列
    • 3、python中的socket模塊,使用該模塊建立客戶連接需要4個步驟。
      • 如何知道服務(wù)器端口
      • 客戶端。
      • 公共用途。


提示:以下是本篇文章正文內(nèi)容,下面案例可供參考

一、TCP/IP簡介

通信雙方必須知道對方的標(biāo)識。互聯(lián)網(wǎng)上計(jì)算機(jī)的唯一標(biāo)識就是IP地址。通常是網(wǎng)卡。
IP 協(xié)議負(fù)責(zé)把數(shù)據(jù)從一臺計(jì)算機(jī)通過網(wǎng)絡(luò)發(fā)送到另一臺計(jì)算機(jī)上。數(shù)據(jù)被分割成一小塊,然后通過IP包發(fā)送過去。 IP包的特點(diǎn)是按快發(fā)送,途徑多個路由,但不保證能到達(dá),也不保證順利到達(dá)。
IP地址實(shí)際上是一個32位整數(shù)(IPv4),以字符串表示的IP地址實(shí)際上是把32位整數(shù)按8位分組后的數(shù)字表示(如192.165.0.1),目的是便于閱讀。
TCP協(xié)議是建立在IP協(xié)議之上的,TCP協(xié)議負(fù)責(zé)在兩臺計(jì)算機(jī)之間建立可靠連接,保證數(shù)據(jù)順利到達(dá)。
一個IP包除了包含傳輸?shù)臄?shù)據(jù)外,還包含源IP地址和目標(biāo)IP地址,源端口和目標(biāo)端口。 而端口的作用是區(qū)分送過來的IP包是給那個程序的。

二、網(wǎng)絡(luò)設(shè)計(jì)模塊

1.Socket簡介

網(wǎng)絡(luò)編程中有一個基本組件----套接字(socket)
套接字為特定的網(wǎng)絡(luò)協(xié)議(如TCP/IP,UDP/IP)套件對上的網(wǎng)絡(luò)應(yīng)用程序提供當(dāng)前可移植標(biāo)準(zhǔn)的對象。套接字允許程序接收數(shù)據(jù)并進(jìn)行連接,為了建立通信通道,網(wǎng)絡(luò)通信的每個端點(diǎn)擁有一個套接字對象級為重要。

2、python中的socket模塊,使用該模塊建立服務(wù)器需要6個步驟。

1.創(chuàng)建socket對象。

該處使用socket()函數(shù)來創(chuàng)建套接字。
語法格式

socket.socket([family[,type[,protoco]]])
  • family :可以是AF_UNIX(用于同一臺機(jī)器上的進(jìn)程間通信),也可以是AF_INET(對于IPV4協(xié)議的TCP和UDP),或AF_INET6(用于TPV6)
  • type:套接字類型可以根據(jù)面向連接和非連接分為SOCK_STREAM(流套接字)或 SOCK_DGRAM(非流套接字)。
  • protoco:一般不填,默認(rèn)為0.

2.將socket綁定(指派)到指定地址上。

socket.bind(address)

address 必須是一個雙元素元組。參數(shù)為主機(jī)名或ip地址加端口。

3.綁定后必須準(zhǔn)備好套接字,以便接收連接。

請求方式如下:

socket.listen(backlog)

backlog 用于指定最多連接數(shù),至少為一。接到連接請求后,這些請求必須排隊(duì),如果已滿,就拒絕請求。

4.服務(wù)器套接字通過socket的accept 方法等待客戶請求一個連接。

調(diào)用accept方法時(shí),socket會進(jìn)入等待(或阻塞)狀態(tài)。客戶請求連接時(shí),accept方法建立連接并返回服務(wù)器。accept方法返回一個含有兩個元素的元組,如(connection,address)。第一個元素(connection)是新的socket對象,服務(wù)器通過它與客戶通信;第二個元素(address)是客戶的互聯(lián)網(wǎng)地址。

5.處理階段,服務(wù)器和客戶通過send和reext方法通信(傳輸數(shù)據(jù))。

服務(wù)器調(diào)用send,并采用字符串形式向客戶發(fā)送信息。send方法返回已發(fā)送的字符個數(shù)。服務(wù)器使用recy方法從客戶接收信息。調(diào)用reev時(shí),必須指定一個整數(shù)控制本次調(diào)用所接收的最大數(shù)據(jù)量。recy方法在接收數(shù)據(jù)時(shí)會進(jìn)入blocket狀態(tài),最后返回一個字符串,用于表示收到的數(shù)據(jù)。如果發(fā)送的量超過recy允許的量,數(shù)據(jù)就會被截?cái)唷6嘤嗟臄?shù)據(jù)將緩沖于接收端。以后調(diào)用recy時(shí),多余的數(shù)據(jù)會從緩沖區(qū)刪除。

6.傳輸結(jié)束,服務(wù)器調(diào)用socket的close方法以關(guān)閉連接。

代碼案列

import socket #引入套接字模塊 #因?yàn)榉?wù)器需要同時(shí)響應(yīng)多個客戶端的請求,每一個連接都需要一個進(jìn)程或新線程#1處理,否則一次只能服務(wù)一個客戶 import threading #引入進(jìn)程模塊 import time def socket_server():server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#步驟1host = socket.gethostname() #獲取本地主機(jī)名port = 5555 #端口號,0-1024 是標(biāo)準(zhǔn)的不能隨意使用,1025-9999 可以隨意#1使用server_socket.bind((host,port)) #參數(shù)必須是雙元素元組,步驟2server_socket.listen(5) #步驟3while True:#會返回一個含有兩個元素的元組。第一個元素是一個新的 socket 對象#服務(wù)器通過它與客戶端通信;第二個元素是客戶的互聯(lián)網(wǎng)地址sock,addr = server_socket.accept() #步驟4# threading.Thread(target =1,args =2)1 對于函數(shù),2是該函數(shù)需要的參數(shù)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('歡迎學(xué)校 Python 網(wǎng)絡(luò)編程!'.encode('utf-8')) #send 發(fā)送數(shù)據(jù) while True:data = sock.recv(1024) #recv 接收數(shù)據(jù),最大為一個字節(jié) 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.創(chuàng)建一個socket以連接服務(wù)器。socket=socket.socket(family,type)
2.使用socket 的connect 方法連接服務(wù)器。 socket.connect((hoat,port))
3.通過send()與recv()方法通信。
4.結(jié)束后,調(diào)用socket的close方法以關(guān)閉連接。

代碼案列:

import socketdef socket_client():s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)host = socket.gethostname()port = 5555s.connect((host,port)) #連接服務(wù)器,指定主機(jī)和端口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()

如何知道服務(wù)器端口

1.域名可以自動轉(zhuǎn)換到IP地址。
2.作為服務(wù)器,提供服務(wù)時(shí)端口號必須固定下來。由于我們想要訪問網(wǎng)頁,因此新浪提供網(wǎng)頁服務(wù)的服務(wù)器必須把端口號固定在80端口。80端口是Web服務(wù)的標(biāo)準(zhǔn)端口。其他服務(wù)都有對應(yīng)的標(biāo)準(zhǔn)端口號,如SMTP服務(wù)是25端口,FTP服務(wù)是21端口,等等。端口號小于1024的是Internet標(biāo)準(zhǔn)服務(wù)端口,端口號大于1024的可以任意使用,


## 4、socket 的一些套接字函數(shù)。 ### 服務(wù)器端。 函數(shù)描述
bind()綁定地址(host,port)到套接字, 在AF_INET下,以元組(host,port)的形式表示地址。
listen()開始TCP監(jiān)聽。backlog指定在拒絕連接之前,操作系統(tǒng)可以掛起的最大連接數(shù)量。該值至少為1,大部分應(yīng)用程序設(shè)為5就可以了。
accept()被動接受TCP客戶端連接,(阻塞式)等待連接的到來

客戶端。

函數(shù)描述
connect()主動初始化TCP服務(wù)器連接,。一般address的格式為元組(hostname,port),如果連接出錯,返回socket.error錯誤。
connect_ex()connect()函數(shù)的擴(kuò)展版本,出錯時(shí)返回出錯碼,而不是拋出異常

公共用途。

函數(shù)描述
recv()接收TCP數(shù)據(jù),數(shù)據(jù)以字符串形式返回,bufsize指定要接收的最大數(shù)據(jù)量。flag提供有關(guān)消息的其他信息,通常可以忽略。
send()發(fā)送TCP數(shù)據(jù),將string中的數(shù)據(jù)發(fā)送到連接的套接字。返回值是要發(fā)送的字節(jié)數(shù)量,該數(shù)量可能小于string的字節(jié)大小。
sendall()完整發(fā)送TCP數(shù)據(jù),完整發(fā)送TCP數(shù)據(jù)。將string中的數(shù)據(jù)發(fā)送到連接的套接字,但在返回之前會嘗試發(fā)送所有數(shù)據(jù)。成功返回None,失敗則拋出異常。
recvfrom()接收UDP數(shù)據(jù),與recv()類似,但返回值是(data,address)。其中data是包含接收數(shù)據(jù)的字符串,address是發(fā)送數(shù)據(jù)的套接字地址。
sendto()發(fā)送UDP數(shù)據(jù),將數(shù)據(jù)發(fā)送到套接字,address是形式為(ipaddr,port)的元組,指定遠(yuǎn)程地址。返回值是發(fā)送的字節(jié)數(shù)。
close()關(guān)閉套接字
getpeername()返回連接套接字的遠(yuǎn)程地址。返回值通常是元組(ipaddr,port)。
getsockname()返回套接字自己的地址。通常是一個元組(ipaddr,port)
setsockopt(level,optname,value)設(shè)置給定套接字選項(xiàng)的值。
getsockopt(level,optname[.buflen])返回套接字選項(xiàng)的值。
settimeout(timeout)設(shè)置套接字操作的超時(shí)期,timeout是一個浮點(diǎn)數(shù),單位是秒。值為None表示沒有超時(shí)期。一般,超時(shí)期應(yīng)該在剛創(chuàng)建套接字時(shí)設(shè)置,因?yàn)樗鼈兛赡苡糜谶B接的操作(如connect())
gettimeout()返回當(dāng)前超時(shí)期的值,單位是秒,如果沒有設(shè)置超時(shí)期,則返回None。
fileno()返回套接字的文件描述符。
setblocking(flag)如果flag為0,則將套接字設(shè)為非阻塞模式,否則將套接字設(shè)為阻塞模式(默認(rèn)值)。非阻塞模式下,如果調(diào)用recv()沒有發(fā)現(xiàn)任何數(shù)據(jù),或send()調(diào)用無法立即發(fā)送數(shù)據(jù),那么將引起socket.error異常。
makefile()創(chuàng)建一個與該套接字相關(guān)連的文件

# SocketTool 編程調(diào)試工具 參考博文:[添加鏈接描述](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.在左側(cè)有tcp和udp的客戶端或服務(wù)端的快捷按鈕,上方有【創(chuàng)建】【刪除】【退出】等選項(xiàng)按鈕。
4 我們先來建立TCP的測試服務(wù)端。點(diǎn)擊【TCP Server】再點(diǎn)擊【創(chuàng)建】。
選擇一個監(jiān)聽端口,這里我們使用6001作為服務(wù)端的監(jiān)聽端口。

建立完成后,服務(wù)端會自動啟動,軟件會顯示【啟動監(jiān)聽】的狀態(tài)。
建立完成后,服務(wù)端會自動啟動,軟件會顯示【啟動監(jiān)聽】的狀態(tài)。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳
我們可以檢測一下本機(jī)的6001端口是否已經(jīng)打開。在DOS窗口中輸入命令【netstat -a】,可以在列表中看到本機(jī)的6001端口的狀態(tài)為listening的狀態(tài),表示本機(jī)的6001端口正處于監(jiān)聽的狀態(tài)。

在DOS窗口中輸入命令【telnet 192.168.0.140 6001】來登錄本地的6001端口。 注意:192.168.0.140 6001 要根據(jù)軟件中本機(jī)的編號來寫。
window下 無法執(zhí)行 telnet 命令的解決方法
1.打開設(shè)置中應(yīng)用。
2.打開右上角的

3.

4.找到telnet 服務(wù),勾選就好

點(diǎn)擊回車鍵,就可以成功登錄6001端口。在測試軟件中就可以看到狀態(tài)是已連接的狀態(tài),同時(shí)也可以看到對方的ip就是本地ip。

在軟件的發(fā)送窗口中輸入1234567890,點(diǎn)擊發(fā)送后,在DOS窗口中就可以看到軟件發(fā)送過來的數(shù)據(jù)了。

若想發(fā)送中文不要勾選16進(jìn)制。

總結(jié)

以上是生活随笔為你收集整理的python网络编程(苦肝一夜,近万字)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。