0

私はこれに多くの時間を費やしましたが、まだ機能していないようです。タスクは-システム統計をURLに送信する必要があり、スクリプトはそれをプルし、マシンの各CPU統計の名前付きタプルを変換してから、それらすべてを1つのPOSTリクエストでJSONとして送信することです。データが送信されたら、接続を閉じる必要があります。

「1 つの POST リクエスト」機能については、後者の関数 (senddata_to_server) をスクリプトに追加しました。それがなければ(接続の詳細は機能なしで単にそこにリストされています)、Mac / Windows / Linuxで実行すると、すべての名前付きタプルが1つずつ返され、次に「200 OK」が返され、「接続」の出力が続行されました永遠に拒否されました。実行すると、何も返さずにハングアップします。

(私は以前にこの質問をしました ( Python JSON を使用した HTTP Post リクエスト ) が、ループ内に「params」を、ループ外に接続の詳細を含める必要があります。

import psutil 
import socket
import time
import sample
import json
import httplib
import urllib

serverHost = sample.host
port = sample.port

thisClient = socket.gethostname()
currentTime = int(time.time())
s = socket.socket()
s.connect((serverHost, port))
cpuStats = psutil.cpu_times_percent(percpu=True)



def loop_thru_cpus():
    while True:
        global cpuStats

        cpuStats = "/n".join([json.dumps(stats._asdict()) for stats in cpuStats])

        try:

            command = 'put cpu.usr ' + str(currentTime) + " " + str(cpuStats[0]) + "host ="+thisClient+ "/n"
            s.sendall(command)
            command = 'put cpu.nice ' + str(currentTime) + " " + str(cpuStats[1]) + "host ="+ thisClient+ "/n"
            s.sendall(command)
            command = 'put cpu.sys ' + str(currentTime) + " " + str(cpuStats[2]) + "host ="+ thisClient+ "/n"
            s.sendall(command)
            command = 'put cpu.idle ' + str(currentTime) + " " + str(cpuStats[3]) + "host ="+ thisClient+ "/n"
            s.sendall(command)
            params = urllib.urlencode({'cpuStats': cpuStats, 'deviceKey': 1234, 'timeStamp': str(currentTime)})
            return params
            print cpuStats

        except IndexError:
            continue
        except socket.error:
            print "Connection refused"
            continue

        finally:
            s.close()


def senddata_to_server():
    x = loop_thru_cpus()
    headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
    conn = httplib.HTTPConnection(serverHost, port)
    conn.request = ("POST", "", x.params, headers)
    response = conn.response()
    print response.status, response. reason
    print x.cpuStats
    conn.close()
loop_thru_cpus()
senddata_to_server()
4

1 に答える 1

0

ここのタスクとコード/ロジックを考えると、何が間違っていますか?

あなたの仕事が何であるかはよくわかりませんが、あなたが間違っているかもしれないことは次のとおりです。

  • サーバーに直接 ( を介してsocket.connect()) 接続し、フレームワークを介して( を介してHTTPlib.connect())接続しています。
  • 改行のスペルを間違えました'\n''/n'
  • 一度しか実行できない while ループがあります (returnその途中にいるため)。
  • returnステートメントの後にprintステートメントがあります
  • 不正な形式putのコマンドを Web サーバーに送信しています
  • loop_thru_cpus()あなたは二度電話する
  • content-type を正しく設定してapplication/jsonいません -- 整形式の json を送信していません。
  • URL を送信していませんHTTPlib.HTTPConnection.request()(実際には許可されている可能性がありますが、ドキュメントでは許可されていません)。
  • conn.request()正しく呼び出していません -- 削除してください=
  • ドキュメントでは、ではconn.getresponse()なく、呼び出すように書かれていますconn.response()

これは、うまくいけばあなたが求めることをするプログラムです:

import psutil 
import socket
import time
import json
import httplib
import urllib

# httpbin provides an echo service at http://httpbin.org/post
serverHost = 'httpbin.org'
port = 80
url = 'http://httpbin.org/post'

# My psutil only has cpu_times, not cpu_times_percent
cpuStats = psutil.cpu_times(percpu=True)

# Convert each namedTuple to a json string
cpuStats = [json.dumps(stats._asdict()) for stats in cpuStats]

# Convert each json string to the form required by the assignment
cpuStats = [urllib.urlencode({'cpuStats':stats, 'deviceKey':1234}) for stats in cpuStats]

# Join stats together, one per line
cpuStats = '\n'.join(cpuStats)

# Send the data ...

# connect
conn = httplib.HTTPConnection(serverHost, port)

# Send the data
conn.request("POST", url, cpuStats)

# Check the response, should be 200
response = conn.getresponse()
print response.status, response.reason

# httpbin.org provides an echo service -- what did we send?
print response.read()

conn.close()
于 2013-09-13T04:01:11.927 に答える