對象套接字為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)注支持我,謝謝