2014-02-06 30 views
0

我今天開始構建一個簡單的客戶機 - 服務器聊天室,我是Python和網絡連接的新手。我犯了這樣的服務器上的一些簡單的代碼:Python套接字錯誤:無法將隱式地將「元組」對象轉換爲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 

我發現了一些示例代碼,但nealy所有這些都使用本地主機。感謝您的幫助。

/////

根據@Jon S.的回答。我的客戶端代碼應該是

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在網下離開&安全

    2.3輸入AWS控制檯並進入EC2

    2.2查找安全組單擊您的當前安全組(對我來說,這是不是默認一個),並打開入站的以下信息

    2.4選擇自定義TCP規則和我貼的代碼輸入你的端口範圍(21237),然後單擊添加規則

    2.5請勿按「按規則修改」按鈕!

3

問題是

HOST = socket.gethostbyaddr('54.201.33.XX') 
在你的第二個例子

。 gethostbyaddr返回一個元組,包含(主機名,別名列表,IP地址)。 connect需要一個字符串作爲指定要連接的地址和端口的元組的第一個元素。

您可以將其更改爲

HOST = '54.201.33.XX' 

,它應該工作。

+0

嗨,喬恩,謝謝你的回覆。我試過了,它不工作?我從EC2實例公共IP獲得了我的IP地址。服務器和客戶端部分的代碼均已附加。你知道什麼是錯的嗎?謝謝。 –

+0

正如@Pykler指出的那樣,您擁有的服務器代碼不會調用listen或accept。 此外,你是什麼意思的「它不工作」?它拋出一個錯誤?定時?哪部分發現錯誤,客戶端或服務器? –

+0

在服務器端,代碼仍然是:HOST = socket.gethostname()。 在客戶端,代碼是:HOST = '54 .201.33.XX' 問題是客戶端超時,因爲它找不到主機。 我檢查了我的IP在EC2。我發現,服務器端主機名是我的私有IP,通過打印出主機名和客戶端我使用公共IP。你知道我應該如何將我的私人IP地址更改爲公共密碼?或者我應該對EC2進行一些操作?謝謝。 –

相關問題