python實(shí)現(xiàn)socket通信 python不同程序間通信
利用python實(shí)現(xiàn)局域網(wǎng)間的通信1.使用python的socket模塊吧,網(wǎng)上例子很多,也可以參考《python網(wǎng)絡(luò)編程》這本書;python中的handle是什么方...
利用python實(shí)現(xiàn)局域網(wǎng)間的通信
1.使用python的socket模塊吧,網(wǎng)上例子很多,也可以參考《python網(wǎng)絡(luò)編程》這本書;
python中的handle是什么方法
在Python中,handle是一個通用的詞,經(jīng)常用于表示某個對象、資源或連接。我們可以通過handle來操作和管理這些東西。
常見的Pythonhandle有:
1.文件handles
在使用Python操作文件時,我們使用文件handles來表示文件對象。
例如:
python
f=open("file.txt")#創(chuàng)建一個文件handle
data=f.read()#使用handle讀取文件內(nèi)容
f.close()#關(guān)閉文件handle,釋放資源
這里`f`就是文件handle,我們通過它讀取和操作文件。
2.Sockethandles
我們通過socket的handle表示Socket連接,并通過它來發(fā)送和接收數(shù)據(jù)。
例如:
python
s=socket.socket()#創(chuàng)建sockethandle
s.connect(("www.google.com",80))#使用handle建立連接
s.send(b"GET/HTTP/1.1\r\nHost:google.com\r\n\r\n")
data=s.recv(1024)#使用handle接收數(shù)據(jù)
這里`s`就是Socket的handle。
3.數(shù)據(jù)庫連接handles
例如用pymysql,我們通過游標(biāo)cursor表示一個數(shù)據(jù)庫會話:
python
connection=pymysql.connect(...)
cursor=connection.cursor()#獲取數(shù)據(jù)庫連接handle
cursor.execute("SELECT*FROMusers")
results=cursor.fetchall()
cursor.close()#關(guān)閉handle
總的來說,在Python中,通過表示資源、對象或連接的handle,可以進(jìn)行相應(yīng)的操作。
handle值得注意的是:
-每次操作結(jié)束后,應(yīng)及時關(guān)閉handle,以釋放資源
-多個handle可同時存在,無需關(guān)閉的操作的handle
socket服務(wù)器怎么識別不同端口
在Socket服務(wù)器中,不同的端口用于識別不同的網(wǎng)絡(luò)服務(wù)或應(yīng)用程序。每個網(wǎng)絡(luò)服務(wù)或應(yīng)用程序都可以通過不同的端口與服務(wù)器進(jìn)行通信。
當(dāng)Socket服務(wù)器啟動時,它會監(jiān)聽一個或多個指定的端口。當(dāng)客戶端嘗試連接到服務(wù)器時,它會使用特定的端口號來建立連接。服務(wù)器通過檢查連接請求中的目標(biāo)端口號來確定客戶端請求的是哪個服務(wù)或應(yīng)用程序。
一旦服務(wù)器識別出客戶端請求的服務(wù)或應(yīng)用程序,它會將連接分配給相應(yīng)的處理程序或線程來處理。這樣,服務(wù)器可以同時處理多個不同端口的連接請求,并為每個連接提供相應(yīng)的服務(wù)。
需要注意的是,端口號是一個16位的整數(shù),范圍從0到65535。其中,0到1023的端口號被稱為“知名端口”,用于一些常見的網(wǎng)絡(luò)服務(wù),如HTTP(端口號80)、FTP(端口號21)等。而1024到65535的端口號被稱為“動態(tài)端口”,用于臨時分配給客戶端連接。
總結(jié)起來,Socket服務(wù)器通過檢查連接請求中的目標(biāo)端口號來識別不同的端口,并將連接分配給相應(yīng)的處理程序或線程來提供相應(yīng)的服務(wù)。
Python的socket模塊中的bind
accept_thread=threading.Thread(target=accept,args=(s,))accept_thread.start()defaccept(s):whileTrue:conn,accept=s.accept()thread_send=MyThread(conn,addr)thread_recv=MyThread(conn,addr)thread_send.start()thread_recv.start()
docker 默認(rèn)的socket端口
關(guān)于容器端口和主機(jī)端口的關(guān)系
首先,我們在創(chuàng)造容器時,如果不指定端口映射,那么這個容器時封閉的,不能與外界網(wǎng)絡(luò)通信。而我們一般情況下則需要指定端口映射,使得我們可以通過主機(jī)的端口訪問到容器。我們常用dockercontainerrun-p8080:80-d*progamme_name*這里我們將容器的80端口映射到主機(jī)的8080端口,之后我們就可以通過主機(jī)的8080端口訪問到容器了。如果想要公開容器的所有端口,則可以用dockercontainerrun-P系統(tǒng)會“隨機(jī)”分配端口到主機(jī)端口。
Socket端口配置
我們在容器內(nèi)運(yùn)行一個python的socket服務(wù)時,這時需要制定綁定的Ip和端口,我們需要注意的是我們雖然映射了端口到主機(jī),但是綁定的ip不是主機(jī)的ip,而是容器內(nèi)的ip,可以通過ifconfig進(jìn)行查詢,或者直接使用0.0.0.0來接受所有ip的該端口請求
關(guān)于0.0.0.0和127.0.0.1和其他ip的關(guān)系
這里有個基礎(chǔ)知識,127.0.0.1是每臺主機(jī)的環(huán)回地址,只用來自身的網(wǎng)絡(luò)測試,而不會和外部通信,然后還有inet內(nèi)部Ip,用于一個公網(wǎng)集群內(nèi)的主機(jī)間的通信,外網(wǎng)訪問不了,公網(wǎng)ip一般是多臺主機(jī)共享。最后0.0.0.0則是表示所有可用的ip.
python獲取當(dāng)前socket連接狀態(tài),是連接還是斷開
socket建立連接后,你可以在上面加一個超時,如果超時異常出現(xiàn)就是斷開了。
另外可以用select(inlist,writelist,errorlist,timeout)的辦法,去輪詢它。超過比如60秒,就認(rèn)為它超時。
在操作系統(tǒng)層面,你可以用netstat找到這個socket連接,看它的TCP狀態(tài)。如果到了CLOSE_WAIT,TIME_WAIT,就是對方或者是自己關(guān)閉了。如果是FIN2.。。。SEN。?;蛘呤荢YN_XXX就是還是連接或者是發(fā)送狀態(tài)中。
通常這些狀態(tài)在操作系統(tǒng)的TCP協(xié)議里都設(shè)置有超時。如果超時過了,它自己會關(guān)閉。然后變成WAIT狀態(tài)。
本文鏈接:http://xinin56.com/ruanjian/170.html