2014-02-06 6 views
0

Я начинаю создавать простую чат-клиентскую серверную комнату сегодня, и я новичок в Python и сетевом подключении. Я сделал простой код на сервере что-то вроде этого:Ошибка сокета Python: невозможно преобразовать объект «tuple» в str неявно

HOST = socket.gethostname() 
PORT = 21238 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 

На клиенте:

HOST = socket.gethostbyaddr('54.201.33.XX') #54.201.33.XX is my EC2 public IP 
PORT = 21237 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((HOST, PORT)) 

Я уже работает мой код сервера на сервер, и когда я пытаюсь запустить код клиента на моем компьютере , Я получил ошибку:

Traceback (most recent call last): 
    s.connect((HOST, PORT)) 
TypeError: Can't convert 'tuple' object to str implicitly 

Я нашел несколько примеров кодов, но неали все они используют локальный хост. Спасибо за помощь.

/////

На основании ответа @ Джон С.,. Мой код клиента должен быть

HOST = '54.201.33.XX' 

Но еще время для подключения к серверу. Я уверен, что мой ip правильный.

+0

См. Верхний ответ ниже. [Здесь хорошо, как о программировании сокетов в python] (http://docs.python.org/2/howto/sockets.html), вам не хватает команды socket.listen на вашем сервере. – Pykler

+0

У меня есть метод прослушивания, но не показан здесь. Теперь проблема теперь похожа на настройку EC2.Я нашел, имя хоста сервера - это мой частный IP, выписав имя хоста, однако на стороне клиента я использую лобковый IP-адрес. Знаете ли вы, что мне делать с EC2? –

+0

Я не уверен в EC2 и брандмауэрах, знаете ли вы, открыт ли этот порт. Самый простой способ тестирования - установить простой сервер и посмотреть, можете ли вы его получить. например 'python -m SimpleHTTPServer 21237' и перейдите по адресу http: //54.201.33.XX: 21237 и посмотрите, можете ли вы получить к нему доступ. – Pykler

ответ

0

Я нашел ответ.

  1. На сервере HOST = socket.gethostname(); На клиенте HOST = '54 .201.33.XX ', который является вашим IP-адресом вашего сервера

  2. В EC2 настройка безопасности по умолчанию является открытой только ssh. Вы должны открыть порт, который вы использовали в своих кодах. Операции следующие:

    2,1 Введите AWS консоль и введите EC2

    2.2 Найти группу безопасности на левой стороне под NETWORK & БЕЗОПАСНОСТИ

    2.3 Нажмите текущую группу безопасности (для меня, это не по умолчанию один) и открытый Inbound на информацию ниже

    2,4 Выберите правило пользовательского TCP и введите диапазон портов (21237 в моем вставленного кода) и нажмите на кнопку добавить правила

    2.5 DO NOT для нажмите кнопку «Применить изменения правила»!

3

Проблема заключается в том

HOST = socket.gethostbyaddr('54.201.33.XX') 

в вашем втором примере. gethostbyaddr возвращает кортеж, содержащий (имя хоста, список псевдонимов, IP-адреса). connect ожидает строку как первый элемент кортежа, который указывает адрес и порт для подключения.

Вы можете изменить это

HOST = '54.201.33.XX' 

и он должен работать.

+0

Привет, Джон, Спасибо за ваш ответ. Я пробовал и не работает? Я получил свой IP-адрес от открытого IP-адреса экземпляра EC2. Оба кода на стороне сервера и клиента прикреплены. Вы знаете, что не так? Благодарю. –

+0

Как указывает @Pykler, код сервера, который у вас есть, не вызывает прослушивания или принятия. Кроме того, что вы подразумеваете под словом «это не работает»? Это ошибка? Сроки? Какая часть видит ошибку, клиент или сервер? –

+0

В конце сервера коды все еще: HOST = socket.gethostname(). В конце клиентских кодов: HOST = '54 .201.33.XX ' Проблема заключается в том, что клиентский тайм-аут не может найти хост. Я проверил свой ip в EC2. Я обнаружил, что имя хоста сервера является моим личным IP-адресом, распечатывая имя хоста и конец клиента. Я использую лобковый IP-адрес. Знаете ли вы, как мне изменить свой частный IP-код на публичный в кодах или я должен выполнить некоторые операции с EC2? Спасибо. –

Смежные вопросы