[C#][Maya][Python] Maya commandPort for external communication / 利用 commandPort 命令讓外部程式與 Maya 溝通

利用 tcp client connection 或 socket connection 來跟 Maya 溝通

先給 python 程式...

import socket

host = YOUR_HOST_ADDRESS # 'localhost' or '127.0.0.1' for local machine, IP_ADDRESS for remote machine
port = YOUR_PORT_NUMBER_OF_MAYA

maya = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
maya.connect( (host, port) )

message = 'sphere()'
maya.send(message)
maya.close()

C# 用 socket connection

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Connect(YOUR_HOST_ADDRESS, YOUR_PORT_NUMBER_OF_MAYA);

string strCmd = "sphere()";
byte[] buf = System.Text.Encoding.Default.GetBytes(strCmd);

NetworkStream ns = new NetworkStream(s);

ns.Write(buf, 0, buf.Length);
ns.Flush();
ns.Close();

s.Close();

C# 用 Tcp client connection 的話也差不多

TcpClient tc = new TcpClient();
tc.Connect(YOUR_HOST_ADDRESS, YOUR_PORT_NUMBER_OF_MAYA);

string strCmd = "sphere()";
byte[] buf = System.Text.Encoding.Default.GetBytes(strCmd);

NetworkStream ns = tc.GetStream();

ns.Write(buf, 0, buf.Length);
ns.Flush();
ns.Close();

tc.Close();

比較需要注意的大概是 commandPort 命令的用法。

如果是使用

commandPort -echoOutput -n ":6000";

則會會開 port 6000 並 bind 在 127.0.0.1 上,這時候如果是要從 remote 機器上來控制就會 connection refused。

如果是使用

commandPort -echoOutput -n "YOUR_IP_ADDRESS:6000";

則會會開 port 6000 並 bind 在 YOUR_IP_ADDRESS 上,這時候如果從本機用 localhost 來控制會 connection refused,但是用 YOUR_IP_ADDRESS 則不會有問題。

最簡單的解決方式是

commandPort -echoOutput -n "0.0.0.0:6000";

這樣不論是本機或者 remote 機器來控制 Maya 做事情都可以很順利。