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<elcount(TxBuffer);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

  • 15
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值