2016-06-14 28 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较好,不当然)。不管它是什么,你都应该在一个地方定义它,而不是将它编码在两个不同的文件中。

对于您在问题中提出的完整代码可能还有其他的说法,但它们不属于这个问题。