0

我在这方面花了很多时间,但似乎仍然无法让它发挥作用。任务是 - 我必须将系统统计信息发送到一个 URL,并且脚本应该将其拉出,转换机器的每个 cpu 统计信息的 namedtuple,然后将它们全部作为 JSON 发送到 1 个单个 POST 请求中。发送数据后,必须关闭连接。

对于“1 个单一的 POST 请求”功能,我在脚本中添加了后一个函数 (senddata_to_server)。没有它(连接详细信息只是简单地列在那里而没有函数),当我在 Mac/Windows/Linux 上运行它时,它曾经以 1 的方式返回所有命名元组,然后返回“200 OK”,然后继续打印“连接”永远拒绝。现在当我运行它时,它只是挂在那里而不返回任何东西。

(我之前已经问过这个问题( HTTP Post request with Python JSON ),但我需要在循环内有'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在它的中间)。
  • 您的退货声明后有打印声明
  • 您正在向putWeb 服务器发送格式错误的命令
  • 你打loop_thru_cpus()了两次电话
  • 您将内容类型错误地设置为application/json- 您没有发送格式正确的 json。
  • 您没有发送网址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 回答