首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >监视TCP/IP连接以获取数据

监视TCP/IP连接以获取数据
EN

Stack Overflow用户
提问于 2016-11-03 06:43:42
回答 1查看 1.2K关注 0票数 2

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

谢谢你的帮忙

安德鲁

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2016-11-03 10:02:52

我假设您使用的是Unix (Linux,Mac ),但也有一些关于Windows的建议。这是一个程序的工作框架,它对设备执行一些强制性的操作,然后等待输入。在这种特殊情况下,我假装您想要实时访问您的激光(就像终端访问),并同时监视响应。

代码语言:javascript
复制
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块。

这一行只适用于类似Unix的系统(Linux、Mac )。为了使它在Windows上工作,请使用select.select([sock], [], [], 0)。不幸的是,为了在这个平台上捕获stdin,您必须创建一个单独的线程。看起来可能是这样的:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40395331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档