2016-11-03 4 views
2

私は、TCP/IP接続を使用してレーザーと通信し、その機能を制御しています。最初は、socket.connect()メソッドを使用してクライアントとしてのレーザー接続を行いますが、レーザーとコンピューターのステータスはすべて同じで、受信した送信と要求の両方をモニターする必要がありますTCP/IPプロトコルのマニュアルを参照してください)。クライアントとして接続してもデータを監視できるようにするには、どのように構成/コードを知ることができますか?私はループでrecv()を使用しようとしましたが、これが正しいかどうかはわかりません。あなたの助けのpython 2.7データのTCP/IP接続の監視

感謝を使用すると、

アンドリュー

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() 

答えて

1

私はあなたがUNIX(Linuxでは、マック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ブロックを削除してください。

この行はUnixライクなシステム(Linux、Mac OS)でのみ動作します。 Windowsで動作させるには、select.select([sock], [], [], 0)を使用してください。残念ながら、このプラットフォームでstdinを捕捉するために別の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) 
関連する問題