草庐IT

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

coder 2023-09-18 原文

我正在使用 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/

有关python - 监视数据的 TCP/IP 连接的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  4. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  5. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  6. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  7. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  10. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

随机推荐