CANOE与python的完美结合

CANOE如何调用python、与python通讯

1.CANOE如何与python通讯

1)使用socket,建立python服务端,监听

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
server.bind(('#IP',#port))
server.listen()

其中connect()函数用于在客户端上建立与服务器的连接。它需要指定服务器的IP地址和端口号作为参数。连接成功后,客户端可以通过该连接与服务器进行通信。

bind()函数用于在服务器端绑定一个特定的IP地址和端口号。它将服务器的Socket与特定的IP地址和端口号关联起来,以便其他客户端可以连接到该地址和端口。服务器通常在启动时调用bind()函数,确保服务端Socket监听的是正确的地址和端口。

需要注意的是,connect()函数只能在客户端使用,而bind()函数只能在服务器端使用。在TCP套接字编程中,客户端通常使用connect()函数连接到服务器,而服务器则使用bind()函数绑定本地地址。

在Socket编程中,accept()是一个阻塞式的系统调用,用于在服务器端接受客户端的连接请求。当服务器程序调用accept()时,它会一直阻塞,直到有客户端请求连接到达。

一旦有连接请求到达,accept()函数返回一个新的套接字,该套接字用于与客户端进行通信。服务器程序可以使用这个新的套接字与客户端进行数据交换。原始的监听套接字则可以继续监听其他客户端的连接请求。

简单来说,accept()函数用于建立服务器和客户端之间的连接。通过调用accept()函数,服务器从挂起状态转移到了与客户端通信的状态。

client,addr = server.accept()

2)建立python线程

包含以下是使用 threading.Thread 创建并启动一个新线程的示例代码:

import threading
def task():
    print("This is a new thread")
#创建线程对象
thread = threading.Thread(target=task)
#启动线程

C#中的Socket函数是用于网络通信的一组类和方法。它们位于System.Net.Sockets命名空间下,并提供了各种功能来创建、连接、发送和接收数据等操作网络套接字。

以下是一些常用的Socket函数:

Socket类:表示一个网络套接字,可以用来进行通信。可以使用Socket类的构造函数来创建一个套接字对象。

Socket.Connect()方法:用于连接到远程主机。需要指定远程主机的IP地址和端口号。

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ipAddress, port);

Socket.Send()方法:用于发送数据。需要将要发送的数据转换为字节数组,并使用该方法发送。

byte[] data = Encoding.ASCII.GetBytes(message);
socket.Send(data);
Socket.Receive()方法:用于接收数据。需要创建一个字节数组来存储接收到的数据,并使用该方法接收。
byte[] buffer = new byte[1024];
int bytesRead = socket.Receive(buffer);
string receivedData = Encoding.ASCII.GetString(buffer, 0, bytesRead);

这些是一些常用的Socket函数,还有其他更多的函数和方法可以用于不同的网络通信操作。可以根据具体的需求和情况来选择适合的函数和方法进行使用。

这样,一个简要的可接收发送的socket python程序就可以出来了

import socket
import threading
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('127.0.0.8',99999))#此处IP与canoe创建的port相对应
server.listen()
def xiancheng(a):
   request = a.recv(1024)
   a.send(bytes("b".encode('utf-8')))
while True:
   client,addr = server.accept()
   handler= threading.Thread(target=xiancheng,args=(client,))
   handler.start()

3)建立CANOEtest端口

以下为CAPL语言:
/*@!Encoding:936*/
variables
{ char strcmda[10] = 'a';
  char strcmdb[10] = 'b';//建立两个用于传递的字符串
  int cmpresult;
}
export void TcpConnectON(dword socket, long result)
{ if(result == 0)
  { write("tcpconnecton 已连接");
  }
}
export void initString(char txBuffer[])
{int i;
for(i=0;i TxBuffer[i] = 0;
}
  EncodeString(TxBuffer, len, 45, txBuffer, CP_UTF8);
}
export void TCPoff()
{ initString("close");
  tcp_Socket.Send(TxBuffer,elCount(TxBuffer));
  testWaitForTimeout(5000);
  Receive_APP = 0;
  Receive_b= 0;
  tcp_Socket.Close();
  tcp_Socket.shutdown();
}
export void TCPon()
{ long ReturnIPAdd;
  char err_String[500];
  dword a = 65651;
  /*----建立TCP链接----*/
  testWaitForTimeout(500);
  tcp_Socket = TcpSocket::Open(ip_Endpoint(127.0.0.8:999990));
  tcp_Socket.Connect(ip_Endpoint(127.0.0.8:99999));
  #端口可寻找电脑上空闲的端口
  
   if ((tcp_Socket.GetLastSocketError() != 0) && (tcp_Socket.GetLastSocketError() != 10035))  
  { tcp_Socket.GetLastSocketErrorAsString( err_String, elcount(err_String) );
    testStepFail("", "TCPSocket::Connect failed with result %d (%s)", tcp_Socket.GetLastSocketError(), err_String );
  }
  else
  { write("tcp_Socket.GetLastSocketError = %d",tcp_Socket.GetLastSocketError());
    testWaitForTimeout(200);
  }
  TCPmessageReceive();
  
  initString("on");
  tcp_Socket.Send(TxBuffer,elCount(TxBuffer));
  testWaitForTimeout(15000);
}
export void TCPmessageReceive()
{ tcp_Socket.Receive(gRxBuffer, 100);
}
export void OnTcpReceive(dword tcp_Socket,long result,dword address,dword port,char buffer[],dword size)
{ if(result == 0 && size != 0)
  { if(0 == strncmp(strcmpa,buffer,1))
   { Receive_APP = 1;
    write("Receive a,python发出的我已收到");
   } 
   if(0 == strncmp(strcmpb,buffer,1))
   { Receive_b = 1;
    write("Receive bbb");
   }
  TCPmessageReceive();
}

p.s.查看目前所占端口CMD指令:

Win: 1. netstat -ano | findstr [端口号]  //说明: netstat -ano | findstr用于查找进程
	 2. taskkill /F /PID [PID]          //说明: taskkill /F /PID用于`强制终止`指定PID的进程
Mac: 1. sudo lsof -i tcp: [端口号]     //说明: 列出打开TCP端口号(如:80)的进程信息
	  2. sudo kill -9 [PID]            //说明:`强制终止`PID(如:1234)的进程
Linux: 1. sudo lsof -i :[端口号]       //说明:显示占用端口号的进程的详细信息,包括进程ID(PID)
	   2. sudo kill -9 [PID]           //说明:`强制终止`PID(如:1234)的进程

4)运行

先运行工程,在运行python,最后运行test module