2016-06-14 2 views
0

내 컴퓨터에 서버를 설치하고 컴퓨터의 다른 프로세스를 도메인 소켓을 사용하여 서버에 연결하고 싶습니다. 다양한 파이썬 가이드를 살펴 봤지만 똑바로 대답 할 수없는 것 같습니다! 여기까지 내 코드가 있습니다.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

글쎄, 완전한 에러 스택은 코드에서이 에러를 생성하는 라인을 찾는 것보다 도움이되지만, 기본적으로 튜플의 값을 문자열 또는 읽기 전용 문자로 extrct해야한다는 것입니다 튜플을 인수로 넘겨주는 대신 버퍼를 사용하십시오 – glls

+0

좋습니다, 전체 오류 스택을 포함하도록 편집했습니다 –

+0

Unix 도메인 소켓에는 포트 번호가 없습니다. http://blog.eduardofleury.com/archives/2007/09/13; 유닉스 도메인 소켓을 원하지는 않지만 파이썬에는 HTTP 서버가있다. "SimpleHTTPServer"- http://www.linuxjournal.com/content/tech-tip-really-simple-http-server- python – TessellatingHeckler

답변

3

오류에 대해 묻는 질문에 대답하기를 당신 ' 다시 받고, documentation는 말합니다 :

AF_UNIX 주소 패밀리에는 단일 문자열이 사용됩니다. AF_INET 주소 패밀리에 쌍 (호스트, 포트)이 사용됩니다.

그리고 언급 된 문자열은 유닉스 소켓 파일 이름입니다. 유닉스 소켓의 경우 호스트와 포트를 잊어 버리십시오.

그래서 당신은 변경해야합니다 :

listen_socket.bind((HOST, PORT)) 

/tmp/my_socket 같은 파일 이름으로 SOCKET_ID을 정의 따라

listen_socket.bind(SOCKET_ID) 

하고 (예를 들어)에 (예를 들어, 어쩌면 a temporary file가 더 나은 사용하지 확실한). 그리고 그것이 무엇이든, 두 개의 서로 다른 파일에 하드 코딩하는 대신 한 곳에서 정의해야합니다.

질문에 입력 한 전체 코드에 대해 다른 내용이있을 수 있지만 질문에 속하지는 않습니다.

관련 문제