gpt4 book ai didi

python - 监视数据的 TCP/IP 连接

转载 作者:可可西里 更新时间:2023-11-01 02:42:17 24 4
gpt4 key购买 nike

我正在使用 TCP/IP 连接与激光器通信并控制其功能。最初,我使用 socket.connect() 方法作为客户端连接到激光器,但随后激光器和计算机都具有“相同的状态,因此两者都必须监视接收到的传输以及发送请求”(如前所述在 TCP/IP 协议(protocol)手册中)。我如何知道配置/代码,以便即使我作为客户端连接也可以监视数据?我试过在循环中使用 recv(),但我不确定这是否正确。使用 python 2.7

感谢您的帮助

安德鲁

import socket
import numpy as np
import json
import time


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

def connect(IP_addrs = '192.168.1.222', port = 39933):
s.settimeout(10)
s.connect((IP_addrs,port))
myIP = s.getsockname()[0]
msg = {"transmission_id" : [1] , "op":"start_link", "parameters":{ "ip_address": myIP}}
reply = send(msg)
print reply

def send(msg):
s.sendall( json.dumps( { "message" : msg } ) )
r = s.recv(1024)
r = json.loads(r)
return r["message"]["parameters"]

def ping():
msg = {'transmission_id' : [2], 'op':'ping', 'parameters':{'text_in':'TESTING'}}
reply = send(msg)
print reply['text_out']


def move_wave_m(wavelength):
msg = {'transmission_id' : [3], 'op':'set_wave_m', 'parameters':{'wavelength': [wavelength],
'report':['finished']}}
reply = send(msg)
print reply
while True:
reply = s.recv(1024)
if not reply:
break
print reply

def poll_wave_m():
msg = {'transmission_id' : [4], 'op':'poll_wave_m'}
return send(msg)



connect()
ping()
s.settimeout(None)
move_wave_m(725.0000)
s.close()

最佳答案

我假设您使用的是 Unix(Linux、Mac OS),但也有一些针对 Windows 的想法。这是一个程序的工作框架,它对设备执行一些强制性操作,然后等待输入。在这种特殊情况下,我假装您想实时访问您的激光器(如终端访问)并同时观察响应。

import sys
import select
import socket

shell_is_active = True
sock = socket.socket()
# connect the socket


def do_mandatory_stuff():
# sendall(...)
pass


def interpret_user_input(user_input):
# in case you want shell access to the laser
print user_input


def main():
do_mandatory_stuff()

# wait for socket or user IO
while shell_is_active:
pending_inputs, _1, _2 = select.select([sys.stdin, sock], [], [], 0)
if not pending_inputs:
continue

for input_source in pending_inputs:
if input_source is sys.stdin:
interpret_user_input(sys.stdin.readline())

if input_source is sock:
print sock.recv(1024) # use more advanced things if needed

sock.close()


if __name__ == '__main__':
main()

这里的关键是 select.select([sys.stdin, sock], [], [], 0) - 它是 select 的非阻塞调用它返回准备好读取 (pending_inputs)、写入 (_1) 和其他条件 (_2) 的描述符列表>).

如果需要在同一个线程中完成某些后台工作以及等待 IO,我将其设置为非阻塞。否则,请随意删除 0 参数和随后的 if block 。

此行仅适用于类 Unix 系统(Linux、Mac OS)。为了使其适用于 Windows,请使用 select.select([sock], [], [], 0)。不幸的是,您必须创建一个单独的 thread用于在此平台上捕获标准输入。它可能看起来像这样:

import threading

sock_lock = threading.Lock()

def interpret_user_input():
while True:
inp = raw_input()
with sock_lock:
sock.sendall(inp)

...
def main():
user_io_thread = threading.Thread(target=interpret_user_input)
user_io_thread.run()

# do mandatory stuff and then call select in a loop
# don't forget "with sock_lock:" each time you use the socket!
# (and other objects shared between threads as well)

关于python - 监视数据的 TCP/IP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40395331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com