2016-06-14 57 views
0

我想在我的電腦上設置一臺服務器,並在我的電腦上使用域套接字連接到服務器上的另一個進程。我已經看過各種Python指南,但我似乎無法找到一個直接的答案!這是我的代碼。使用帶python的域套接字設置本地服務器?

客戶:

import socket; 
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM); 
s.connect("8888") 

服務器:

import socket 

HOST, PORT = 'host', 8888 

listen_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
listen_socket.bind((HOST, PORT)) 
listen_socket.listen(1) 
print 'Serving HTTP on port %s ...' % PORT 
while True: 
    client_connection, client_address = listen_socket.accept() 
    request = client_connection.recv(1024) 
    print request 

    http_response = """\ 
HTTP/1.1 200 OK 

Hello, World! 
""" 
    client_connection.sendall(http_response) 
    client_connection.close() 

運行的服務器時,我得到了以下錯誤:

Traceback (most recent call last): 
    File "webServer.py", line 7, in <module> 
    listen_socket.bind((HOST, PORT)) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 228, in meth 
    return getattr(self._sock,name)(*args) 
TypeError: argument must be string or read-only character buffer, not tuple 
+0

好吧,完整的錯誤堆棧會更有幫助,而不是尋找代碼中哪行會產生這個錯誤,但基本上,這是說你必須將元組中的值作爲字符串或只讀字符緩衝區而不是傳遞元組作爲參數 – glls

+0

好吧,我編輯它以包含整個錯誤堆棧 –

+0

Unix域套接字沒有端口號。 http://blog.eduardofleury.com/archives/2007/09/13;儘管看起來你根本不需要Unix域套接字,但Python自帶了一個HTTP服務器 - 「SimpleHTTPServer」 - http://www.linuxjournal.com/content/tech-tip-really-simple-http-server- python – TessellatingHeckler

回答

3

要回答你問錯誤的問題,你」重新得到,documentation說:

單個字符串用於AF_UNIX地址系列。一對(主機,端口)用於AF_INET地址族

而提到的字符串是Unix套接字文件名。對於Unix套接字,忘記主機和端口。

所以,你應該改變:

listen_socket.bind((HOST, PORT)) 

成(例如)

listen_socket.bind(SOCKET_ID) 

並相應地確定SOCKET_ID作爲文件名,如/tmp/my_socket(例如,也許使用a temporary file較好,不當然)。不管它是什麼,你都應該在一個地方定義它,而不是將它編碼在兩個不同的文件中。

對於您在問題中提出的完整代碼可能還有其他的說法,但它們不屬於這個問題。