在MQL5中接收Python生成的套接字输出

34

我已经创建了一个套接字文件,类似于以下内容,并希望该套接字的输出必须由MQL5读取。请查看以下Python代码:

daemon.py

import socket
#import arcpy

def actual_work():
    #val = arcpy.GetCellValue_management("D:\dem-merged\lidar_wsg84", "-95.090174910630012 29.973962146120652", "")
    #return str(val)
    return 'dummy_reply'


def main():
    sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
    try:
        sock.bind( ('127.0.0.1', 6666) )

        while True:
            data, addr = sock.recvfrom( 4096 )
            reply = actual_work()
            sock.sendto(reply, addr)
    except KeyboardInterrupt:
        pass
    finally:
        sock.close()


if __name__ == '__main__':
    main()

客户端.py

import socket
import sys


def main():
    sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
    sock.settimeout(1)
    try:
        sock.sendto('', ('127.0.0.1', 6666))
        reply, _ = sock.recvfrom(4096)
        print reply
    except socket.timeout:
        sys.exit(1)
    finally:
        sock.close()


if __name__ == '__main__':
    main()

请帮我接收通过MQL5的套接字输出。

编辑

我只想要reply在MQL5中被接受为一个变量,这个变量是由daemon.py生成的。我该如何做呢?比如说,我希望MQL5应该像上面的示例一样打印来自Python的响应,如果可能的话,我希望MQL5应该把dummy_reply作为字符串变量输出。

使用ZeroMQ有可能实现吗?

我想用MQL5代替Python来完成client.py。请帮帮我。


1
你有基本的UDP客户端/服务器示例代码。这与MQL5有什么关系?你想用MQL5传达什么? - AKX
你明白我想达到的目标了吗?或者你有任何问题,请随意问。 - Jaffer Wilson
有人能帮我吗?请告诉我。 - Jaffer Wilson
@bigdataolddriver 是的,你说得对。 - Jaffer Wilson
有官方文档和演示可供参考: https://www.mql5.com/zh/docs/network https://www.mql5.com/zh/docs/network/socketconnect 你可以从这里开始,你的原始问题可能会更简单。 - James Li
显示剩余4条评论
1个回答

1
请查看一个运行示例。重要的元素是在发送回复之前创建载荷的字节对象,而不是字符串。socket对象只能生成和摄取字节

    import socket
    import threading
    import sys


    def actual_work(data):
       print(data)
       return b'ACK'

    def daemon():
       sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
       sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
       sock.bind(('127.0.0.1', 6666))
       print("Listening on udp %s:%i" % ('127.0.0.1', 6666))
       try:

          while True:
              data, addr = sock.recvfrom(4096)
              ack = actual_work(data)
              sock.sendto(ack, addr)
       except Exception as e:
          print(e)  
       finally:
          sock.close()


    def client():
       sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
       sock.settimeout(1)
       try:
           sock.sendto(b'payload', ('127.0.0.1', 6666))
           reply, _ = sock.recvfrom(4096)
           print(reply)
       except socket.timeout as e:
           print(e)
           sys.exit(1)
       finally:
           sock.close()

    if __name__ == '__main__':
        thread = threading.Thread(target=daemon)
        thread.start()
        client()
        client()
        client()
        client()
        #Issue kill thread here
        thread.join()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接