2012-10-04 29 views
0

我不想從服務器返回無限循環中的值,而是想創建一個方法,例如getPositions(),它會在連接服務器仍在運行時返回我想要的特定位置。我該怎麼做?我如何讓這個while循環變成一個方法?

import socket 
import os,sys 
import time 

HOST = '59.191.193.59' 
PORT = 5555 

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
client_socket.connect((HOST,PORT)) 

screen_width = 0 
screen_height = 0 
while True: 

    client_socket.send("loc\n") 
    data = client_socket.recv(8192) 
    coordinates = data.split() 

    if(not(coordinates[-1] == "eom" and coordinates[0] == "start")): 
     continue 

    if (screen_width != int(coordinates[2])): 
     screen_width = int(coordinates[2]) 
     screen_height = int(coordinates[3]) 


    print int(coordinates[8]) 
    print int(coordinates[9]) 
    print int(coordinates[12]) 
    print int(coordinates[13]) 

enter image description here

+0

你'if'條件將無法正常工作。 'continue'後面的東西永遠不會執行。 – Blender

+0

@Blender我該如何解決這個問題? – Edward

+0

@Edward通過點擊您帖子關鍵字下方的「編輯」鏈接編輯您的帖子。我已經做到了:) – halex

回答

0

這應該是相當直接:

import socket 
import os,sys 
import time 
from threading import Thread 

HOST = '59.191.193.59' 
PORT = 5555 

COORDINATES = [] 

def connect(): 
    globals()['client_socket'] = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    client_socket.connect((HOST,PORT)) 

def update_coordinates(): 
    connect() 
    screen_width = 0 
    screen_height = 0 
    while True: 
     try: 
      client_socket.send("loc\n") 
      data = client_socket.recv(8192) 
     exept: 
      connect(); 
      continue; 

     globals()['COORDINATES'] = data.split() 

     if(not(COORDINATES[-1] == "eom" and COORDINATES[0] == "start")): 
      continue 

      if (screen_width != int(COORDINATES[2])): 
       screen_width = int(COORDINATES[2]) 
       screen_height = int(COORDINATES[3])    

Thread(target=update_coordinates).start() 

// Run your controlling app here. COORDINATES will be available in the global scope and will be updated constantly 

編輯:創建方法裏面get_coordinates功能重新建立在失敗的情況下套接字連接。

+0

*還有什麼你想要做的?*是的,可能是*做一個方法,例如getPositions()返回特定位置*部分。但我承認這個問題不是很清楚...... – sloth

+0

@ Mr.Steak,因爲我從服務器返回了連接到攝像頭的服務器和使用open cv進行對象檢測的值。我只是害怕,如果它可能會從服務器斷開連接,如果我把我現在的代碼放在方法 – Edward

+0

@David Morton像我之前提到的,我只是害怕它會從服務器斷開連接,因爲我正在使用活來自服務器的數據(: – Edward

0
import socket 
import os,sys 
import time 

HOST = '59.191.193.59' 
PORT = 5555 

# don't restrict yourself to IPv4 without any need: 
client_socket = socket.create_connection((HOST,PORT)) 

def update_coordinates(client_socket): 
    client_socket.send("loc\n") 
    data = client_socket.recv(8192) 
    coordinates = data.split() 

    if(not(coordinates[-1] == "eom" and coordinates[0] == "start")): 
     return None # or so 

    return [int(i) for i in coordinates[1:-1]] 

screen_width = 0 
screen_height = 0 

while True: 
    coord = update_coordinates(screen_width) 
    if coord is None: continue 
    # ! indexes have changed... 
    if (screen_width != coord[1]): 
     screen_width = coord[1] 
     screen_height = coord[2] 
    print coordinates[7] 
    print coordinates[8] 
    print coordinates[11] 
    print coordinates[12] 

我不知道如果我得到了問題的權利,但...

+0

如果您的解決方案從服務器返回數據,它允許我使用更新座標方法,只要我需要然後它應該是正確的數據以像這樣的字符串返回['start','inch','640','480','0','0','640','480','488','290',' 15','teset1','336','184','37','eom'] – Edward

+0

如果你的解決方案從服務器返回數據,並且它允許我使用更新座標方法,數據以字符串形式返回['start','inch','640','480','0','0','640','480','488',' 290','15','teset1','336','184','37','eom'] – Edward

+0

@Edward「開始」和「'eom''被省略。如果你需要它,我會留下來讓你糾正。如果你的某些數據不是數字,那麼'int()'的東西也需要被修正...... – glglgl

相關問題