2012-12-19 84 views
1

我有以下腳本,我希望連接到我們的產品,送TCL命令(設定頻率和其他一些),但它只是顯示:如何通過python中的套接字進行連接?

導入服務器

Server.ScktConn()

頻率(450-2500):600

的recv:0 ace_set_frequency C1 600

這是拳頭命令,但它甚至沒有設置頻率(只顯示cmd,但沒有應用它)!

這裏是腳本:

import socket 
import threading 
import time 

address = ('127.0.0.1', 5426) 
def ScktRecv(): 
    r = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    r.bind(address) 
    r.listen(5) 
    conn, _ = r.accept() 
    csvid = conn.recv(4096) 
    print "recv: %s" % csvid 
    conn.close() 

def ScktConn(): 
    recv_thread = threading.Thread(target=ScktRecv) 
    recv_thread.start() 
    time.sleep(1) 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect(address) 
    # our local IP is 192.168.2.1, but it works even with 127.0.0.1, I don't know from where  #it is coming 
    Freq=raw_input('Frequency(450-2500): ') 
    CmdF='0 ace_set_frequency C1 '+str(Freq)+' \r\n' 
    s.send(CmdF) 
    s.send('0 ace_azplayer_remove_player AzPlayer1 \r\n') 
    s.send('0 ace_azplayer_add_player \r\n') 
    s.send('0 ace_azplayer_add_ace AzPlayer1 C1\r\n') 
    Path='C:/Users/amir_rajaee/Desktop/gridview_script/PBF/4x4U_wocorr_SNR.csv' 
    s.send('0 ace_azplayer_load_csvfile AzPlayer1 '+Path+' \r\n') 
    s.close() 

但是當我使用下面的腳本,它設置頻率,但我的問題是,我沒有接收器;我需要輸出最後一條命令(加載csv文件)!:

import socket 
def ScktConn(): 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(('127.0.0.1', 5006)) 
Freq=raw_input('Frequency(450-2500): ') 
CmdF='0 ace_set_frequency C1 '+str(Freq)+' \r\n' 
s.send(CmdF) 
s.send('0 ace_azplayer_remove_player AzPlayer1 \r\n') 
s.send('0 ace_azplayer_add_player \r\n') 
s.send('0 ace_azplayer_add_ace AzPlayer1 C1\r\n') 
Path='C:/Users/amir_rajaee/Desktop/gridview_script/PBF/4x4U_wocorr_SNR.csv' 
s.send('0 ace_azplayer_load_csvfile AzPlayer1 '+Path+' \r\n') 

回答

1

您似乎在這裏有兩個問題。

1)您期望打印tcl命令將執行它們。情況並非如此。請參閱subprocess library瞭解如何實現此目標。

2)您只能撥打socket.recv一次。爲了捕獲所有的發送,你需要接收者不斷地監聽發送的消息。更改SockRecv到:

address = ('127.0.0.1', 5426) 
def ScktRecv(): 
    r = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    r.bind(address) 
    r.listen(5) 
    conn, _ = r.accept() 
    while True: 
     csvid = conn.recv(4096) 
     if csvid: 
      print "%s" % csvid 
    conn.close() 

您需要作進一步修訂,以正確地與線程的生命週期處理。

+0

謝謝,現在我收到所有的命令,但只是命令的名字!我看不到他們的工作!當我使用第二個沒有Recv的腳本時,這些命令做了他們應該做的事情,但是當我運行第一個腳本w/recv和scktconn時,我擁有的僅僅是命令文本,他們沒有做他們應該做的事情! – Sonic

+0

更新的Recv方法: – Sonic

+0

DEF ScktRecv(): R = socket.socket(socket.AF_INET,socket.SOCK_STREAM) r.bind(地址) r.listen(5)美國康涅狄格州 ,_ = r.accept() 而真: csvid = conn.recv(4096) 如果csvid: 打印 「的recv:%的」 %csvid conn.close() – Sonic