6

我正在创建一个非常简单的 python 脚本,旨在打开一个 TCP 套接字并发送一些 JSON 数据。(我是 python 新手)

我在运行脚本时收到以下错误:

Traceback (most recent call last):
  File "JSONTest.py", line 17, in <module>
    s.connect('10.12.0.30', 6634)
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
TypeError: connect() takes exactly one argument (2 given)

我的脚本如下:

#Imports
import socket
import json
import time

data = "{\"method\": \"echo\",\"id\": \"echo\",\"params\": []}"

#Create socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#Establish TCP session via IP address and port specified
s.connect('10.12.0.30', 6634)

#Send JSON to socket
s.send(json.dumps(data))

#Wait for response and print to console
result = json.loads(s.recv(1024))
#print str(result)

#Exit
s.close()

我检查了套接字库上的文档,并且 connect() 仅列出了一个参数,即所需的目标 IP 地址。所以,我的问题是,如果 connect() 方法不允许我在那里输入它,我该如何执行上述操作,我还指定了我的 TCP 端口?

我也愿意输入更好的方法来实现这一点。

4

4 回答 4

18

主机和端口必须是一个元组。

s.connect(('10.12.0.30', 6634))

请在此处查看 Python Socket 文档中示例的第二部分。

于 2013-10-02T17:33:46.607 回答
4

您必须connect使用一个参数调用:带有主机和端口的元组:

s.connect(('10.12.0.30',6677))
于 2013-10-02T17:35:20.193 回答
0

使用 socket.getaddrinfo 检查此解决方案:

ainfo = socket.getaddrinfo("10.12.0.30",6677)
s.connect(ainfo[0][4])
于 2016-11-06T00:50:43.203 回答
-1

您应该检查 python 的版本,因为 socket.connect(.....) 在 2.0 及更高版本之后采用元组,请遵循该版本的 python 文档这里是python 2.7 文档的片段

socket.connect(地址)

连接到地址处的远程套接字。(地址的格式取决于地址族——见上文。)

注意 此方法历来接受 AF_INET 地址的一对参数,而不仅仅是一个元组。这从来都不是故意的,并且在 Python 2.0 及更高版本中不再可用。

于 2016-05-19T14:05:42.303 回答