2013-10-02 3 views
3

Я создаю чрезвычайно простой скрипт python, предназначенный для открытия сокета TCP и отправки некоторых данных JSON. (Я новичок в Python)TypeError: Connect() принимает ровно один аргумент

Я ПОЛУЧАТЬ ошибку ниже при запуске сценария:

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-адрес назначения. Итак, мой вопрос: как я могу сделать выше, где я также указываю свой TCP-порт, если метод connect() не позволяет мне его вводить?

Я также открыт для ввода лучших путей для достижения этой цели.

+0

Что касается альтернативы, к какой среде у вас есть доступ? – RyPeck

ответ

10

Хост и порт должны быть кортежем.

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

См вторую часть, например, в Python Socket documentation here.

+0

Спасибо - это вложенная скобка, о которой я не знал. Спасибо, что были добры к noobie! – Mierdin

3

Вы должны вызвать connect с одним аргументом: кортеж с хостом и портом:

s.connect(('10.12.0.30',6677)) 
-1

Вы должны проверить версию питона, потому что Socket.connect (.....) принимает кортеж после версии 2.0 и позже, пожалуйста, следуйте документации питона для этой версии здесь является надрез на documentation for python 2.7:

socket.connect(address)

Connect to a remote socket at address. (The format of address depends on the address family — see above.)

Note This method has historically accepted a pair of parameters for AF_INET addresses instead of only a tuple. This was never intentional and is no longer available in Python 2.0 and later.

0

Проверить это решение с помощью socket.getaddrinfo:

ainfo = socket.getaddrinfo("10.12.0.30",6677) 
s.connect(ainfo[0][4]) 
Смежные вопросы