目录
1.基础信息
- 软件版本 19.0.0
- 基于flexsim User Commands 及Scrip实现
- 实现信息收发及与python的通信
- 代码可复用于多种场合的业务。
2.flask基本语法及命令
客户端部分:
socketinit (); //初始化windows后台程序
clientcreate ();//创建客户端socket,并返回一个值。如果创建成功,则返回一个非0正值,否则返回0。后续的连接、收发消息都需要这个值。
clientconnect (num socket, str hostname, num port)
//连接服务器,三个参数分别是clientcreate ()返回的值,服务端的IP地址或本地电脑全名,服务端监听的端口,连接成功则返回一个非0正值,否在返回0。
clientreceive (num socket, str buffer, num buffersize, num noblock[1/0])
//接收服务端发送到socket的消息,返回值为一串字符串。
clientsend (num socket, str message[, num charlength])
//发送消息到socket,如果成功发送,则返回一个非0正值,否则在返回0
clientclose (num socket);//关闭当前socket
socketend ();//关闭所有从socketinit()开始建立的socket,即断开所有连接
服务端部分:
serverclosemain () ;//关闭服务端server及所有打开的连接,一般再模型开始时使用,确保所有连接都已关闭。
socketinit () ;//初始化windows后台程序
servercreatemain (int port) ;//创建指定端口的服务端socket,该端口与客户端的端口保持一致。
serveraccept (int noblocking) ;//监听客户端接入,如果有客户端接入,则返回非0正值,否在返回0。参数noblocking=1,如果没有客户端接入,模型不会停止,但会返回0值;noblocking=0,模型会停止,等待客户端接入后继续运行,并返回一个非0正值。
注:尝试在noblocking=1的情况下连接客户端都以失败告终,暂未获知其中原因。
serverreceive (int connection, char *buffer, int bufsize, int noblocking)
//接收客户端发送到socket的消息,返回值为一串字符串。
serversend (int connection, char* message [, num charlength] )
//发送消息到socket,如果成功发送,则返回一个非0正值,否则在返回0。
servercloseconnection (int connection)
//关闭当前服务端连接。
socketend ()
//关闭所有打开的socket连接。
3.传输示例
客户端部分:
服务端部分:
4.代码
treenode connection = assertsubnode(node("/Tools",model()), "client", DATATYPE_NUMBER);
string hostname = parstr(1);
int portnum = parval(2);
int client = 0;
if(socketinit()) {
client = clientcreate();
}
if(client)
{
if(clientconnect(client,hostname,portnum))
{
setnodenum(connection,client);
return 1;
}
else
{
msg("Client Error", "Failed to connect to server.");
if(!clientclose(client))
msg("Socket Error", "Failed to close client socket.");
return 0;
}
}
else
msg("Socket Error", "Failed to create client socket.");
return client;
int portnum = parval(1);
treenode connection = assertsubnode(node("/Tools", model()), "client", DATATYPE_NUMBER);
if(socketinit())
{
servercreatemain(portnum);
int client = serveraccept(0);
if(!client)
{
serverclosemain();
msg("Client Error", "No client connection made.");
return 0;
}
else
{
setnodenum(connection, client);
return 1;
}
}
else
{
msg("Socket Error", "Socket not initiated.");
return 0;
}
5.python与flexsim互联
利用python的socket模块,可以实现一个基础的服务端,对flexsim的数据实现接收
传入的信息:
回传的信息:
import socket
backlog=5
sk = socket.socket()
sk.bind(('127.0.0.1',8888))
sk.listen(backlog)
print("开始等待接受客户端数据----")
while True:
conn, addr = sk.accept() # 获取客户端地址
print(conn, addr)
print("客户端来数据了")
while True:
data = conn.recv(1024) # 接收数据
print("接受的数据:", data)
if not data:
print("client has lost")
break
conn.send(data.upper()) # 返回数据
serve.close()
treenode textobj = node("/Text4",model());
double client = getnodenum(node("/Tools/client",model()));
clientsend(client,"17.1:0.1.1");
string input=clientreceive(client,NULL,15,1);
if(!comparetext(input,"")) // If an empty string was received, then the client has not sent any data yet.
{
msg("Access succeed",input);
setlabelstr(textobj,"text",input);
return input;
}
return 0;