Python利用socket與應(yīng)用程序之間進(jìn)行通信

對象套接字為PlantSimulation提供TCP/IP接口,它具有與其他應(yīng)用程序進(jìn)行通信的能力。

Socket可以看作是插口或者插槽,可以想象為一根網(wǎng)線,一頭插在客戶端,一頭插在服務(wù)端,然后進(jìn)行通信。在通信之前,雙方需要建立連接。


要在python 中建立具有TCP和流套接字的簡單服務(wù)器,需要使用socket模塊。利用該模塊包含的函數(shù)和類定義,可生成通過網(wǎng)絡(luò)通信的程序。一般來說,建立服務(wù)器連接需要六個步驟。

第1步是創(chuàng)建socket對象。調(diào)用socket構(gòu)造函數(shù)。

socket=socket.socket(familly,type)

family:可以是AF_UNIX(Unix域,用于同一臺機器上的進(jìn)程間通訊),也可以是AF_INET(對于IPV4協(xié)議的TCP和 UDP)

type參數(shù),SOCK_STREAM(流套接字)或者 SOCK_DGRAM(數(shù)據(jù)報文套接字),SOCK_RAW(raw套接字)。


第2步則是將socket綁定(指派)到指定地址上。

socket.bind(address)

address必須是一個雙元素元組,((host,port)),主機名或者ip地址+端口號。如果端口號正在被使用或者保留,或者主機名或ip地址錯誤,則引發(fā)socke.error異常。


第3步,綁定后,必須準(zhǔn)備好套接字,以便接受連接請求。

socket.listen(backlog)

backlog指定了最多連接數(shù),至少為1,接到連接請求后,這些請求必須排隊,如果隊列已滿,則拒絕請求。


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

connection,address=socket.accept()

調(diào)用accept方法時,socket會進(jìn)入'waiting'(或阻塞)狀態(tài)??蛻舳苏埱筮B接時,方法建立連接并返回服務(wù)器。

accept方法返回一個含有兩個元素的元組,形如(connection,address)。connection為新的socket對象,服務(wù)器通過它與客戶通信;

address為客戶端的internet地址。


第5步是處理階段,服務(wù)器和客戶通過send和recv方法通信(傳輸數(shù)據(jù))。服務(wù)器調(diào)用send,并采用字符串形式向客戶發(fā)送信息。send方法返回已發(fā)送的字符個數(shù)。

服務(wù)器使用recv方法從客戶接收信息。調(diào)用recv時,必須指定一個整數(shù)來控制本次調(diào)用所接收的最大數(shù)據(jù)量。recv方法在接收數(shù)據(jù)時會進(jìn)入'blocket'狀態(tài),最后返回一個字符串,用它來表示收到的數(shù)據(jù)。如果發(fā)送的量超過recv所允許,數(shù)據(jù)會被截斷。多余的數(shù)據(jù)將緩沖于接收端。以后調(diào)用recv時,多余的數(shù)據(jù)會從緩沖區(qū)刪除。


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

套接字通信是通信軟件最廣泛的。套接字是在初始化期間建立的點對點連接,允許在線交換數(shù)據(jù)。由于套接字連接直接基于TCP/IP協(xié)議,因此可以確??焖偻ㄐ拧?/p>

使用套接字連接時,一個進(jìn)程充當(dāng)服務(wù)器,其他進(jìn)程注冊為客戶端。Plant Simulation既可以是客戶端,也可以是服務(wù)器。

對套接字有了大概的了解,下面我們來實操。

在開始前我們需要選擇文件—模型設(shè)置取消禁止訪問計算機。


然后在模型中插入如下3個對象,Value 為變量,一個方法對象,一個套接字對象。


雙擊打開套接字對象按如下設(shè)置


Method方法輸入如下代碼:

param SocketChannelNo: integer, Mge: string-- 賦值給全局變量if strLen(Mge) = 1

?? value :=to_str(ascii(Mge)) –- 接收字節(jié)

else

?? value :=to_str(Mge) –- 接收字節(jié)end

-- 將消息寫入控制臺

print "--------------------------------------------------------------------";

print selfprint "Message: The number ", value, " was

received at ", sysdate

打開Python 編輯器,輸入如下代碼:

import sys

from socket import *

serverHost = '127.0.0.1'

serverPort = 30000

#發(fā)送至服務(wù)端的默認(rèn)文本


#如果參數(shù)大于1的話,連接的服務(wù)端為第一個參數(shù)

if len(sys.argv) > 1:

??? serverHost = sys.argv[1]

??? #如果參數(shù)大于2的話,連接的文字為第二個參數(shù)

??? if len(sys.argv) > 2:

??????? message = sys.argv[2:]


#建立一個tcp/ip套接字對象

sock_obj = socket(AF_INET, SOCK_STREAM)

#連接至服務(wù)器及端口

sock_obj.connect((serverHost, serverPort))

loop = True

while loop:

? #經(jīng)過套按字發(fā)送line至服務(wù)端

? name = input("請輸入指令:")

? if name == '結(jié)束':

??? loop = False

? else:

??? sock_obj.send(name.encode())

??? #從服務(wù)端接收到的數(shù)據(jù),上限為1k

??? data = sock_obj.recv(1024)

??? #確認(rèn)他是引用的,是'x'

??? print('Client received:',repr(data))


#關(guān)閉套接字

sock_obj.close( )

然后我們運行pyhon,我用的是Pytharm編輯器,當(dāng)提示請輸入指令的時候就證明Python以及與Plant Simulation建立了連接,這時在交互窗口輸入“Hello, PlantSimulation”

在模型界面就可以看到了傳過來的值。


如果我們要回復(fù)python 該如何寫呢

下面我們在模型中再創(chuàng)建一個變量和方法

如下所示


變量Variable 賦值“Hello,Python”


Sendmethod方法代碼:

套接字.write(0,Variable)

然后右鍵點擊運行Sendmethod方法,我們再回到pytharm可以看到傳過來的值


在Plant Simulation控制臺可以看到與pytharm的交互。

大家可以試下在pytharm中輸入中文,控制臺也可以接收到,但是如果從Plant Simulation傳中文會出現(xiàn)亂碼,需要轉(zhuǎn)換成中文。


感謝大家的閱讀,如果對你有幫助請點贊關(guān)注支持我,謝謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容