2014-04-25 2 views
4

나는 지난 몇 시간 동안 간단한 서버/클라이언트 유닉스 소켓 예제를 찾고 있었다. 파이썬 2.X에 대한 예제를 발견했지만 파이썬 3.X에서 작동하는 파이썬을 찾는데 실패하고 있습니다.파이썬 3.X 유닉스 소켓 예제

계속 TypeErrors가 발생합니다.

내가 작업 한 예는 다음과 같습니다

client.py

클라이언트 부분으로
# -*- coding: utf-8 -*- 
import socket 
import os 
# import os, os.path 

print("Connecting...") 
if os.path.exists("/tmp/python_unix_sockets_example"): 
    client = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) 
    client.connect("/tmp/python_unix_sockets_example") 
    print("Ready.") 
    print("Ctrl-C to quit.") 
    print("Sending 'DONE' shuts down the server and quits.") 
    while True: 
#  try: 
      x = input("> ") 
      if "" != x: 
      print("SEND:", x) 
       client.send(x) 
       if "DONE" == x: 
        print("Shutting down.") 
       break 
#  except KeyboardInterrupt, k: 
#   print("Shutting down.") 
    client.close() 
else: 
    print("Couldn't Connect!") 
    print("Done") 
  • , 나는 KeyboardInterupt 3에서 작업하는 방법을 확실하지 않았다 .X, 그래서 나는 Try와 Except 부분을 죽였다. 어떤 충고?
  • 또한 사용 된 예제의 구문은 하나의 가져 오기에서 여러 모듈을로드했습니다. import os, os.path os 모듈에서 os.path를로드하는 오래된 방법입니까?

server.py

# -*- coding: utf-8 -*- 

import socket 
import os 
# import os, os.path 
# import time 

if os.path.exists("/tmp/python_unix_sockets_example"): 
    os.remove("/tmp/python_unix_sockets_example") 

print("Opening socket...") 
server = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) 
server.bind("/tmp/python_unix_sockets_example") 

print("Listening...") 
while True: 
    datagram = server.recv(1024) 

    if not datagram: 
     break 
    else: 
     print("-" * 20) 
     print(datagram) 
     if "DONE" == datagram: 
      break 
print("-" * 20) 
print("Shutting down...") 
server.close() 
os.remove("/tmp/python_unix_sockets_example") 
print("Done") 
  • 나는이 내가 얻을 실행하면 형식 오류 : 'STR'는 버퍼 인터페이스를 지원하지 않습니다.

  • 파이썬 3.4 유닉스 소켓은 바이너리 만 지원합니까?

  • 이 작업을 수행하는 가장 쉬운 방법은 무엇입니까?

미리 감사드립니다. 당신이해야 할 수 있습니다

+0

www.velvetcache.org의 John Hobbs의 도움을 받아 필자는 Python 3.4에서 위의 작업을 수행 할 수있었습니다. 도와 줘서 고마워 존! https://gist.github.com/jmhobbs/11276249 – Timis

답변

-2

한 가지 대체하는 경우 os.path.exists ("/ tmp를/python_unix_sockets_example")를 가진 경우 os.path.exists 진정한 ("/ tmp를/python_unix_sockets_example") == :

+1

정확하게 동일합니다 – Grief

+0

실제로는 선이 잘못 표현 된 경우 'os.path 인 경우'입니다.exists ("/ tmp/python_unix_sockets_example")은 True :'인 반면'=='는 변수를 값과 일치시키는 것입니다. 'if x == "에서처럼 일부 텍스트 문자열": print (x)'. – Ben

0

명시 적으로 영업 이익의 질문에 대답하려면 :

  1. : 오류 발생 바이트 인터페이스를 통해 문자열 인코딩 된 데이터를 송/수신을 시도하여 발생했다 "형식 오류 'STR'버퍼 인터페이스를 지원하지 않습니다."

  2. 유닉스 소켓은 원시 바이트를 전달하고 Python 3+는 더 이상 매직 바이트 < -> 인코딩 된 문자열 변환을하지 않으므로이 의미에서 (Python 3 (.4)) 유닉스 소켓은 "바이너리"만 지원합니다.

  3. 가장 쉬운 방법은 @jmhobbs가 위의 링크 된 요지에서 보여준 것입니다 : 문자열을 client.send() 할 때 문자열을 .encode()하고 바이트를 .decode server.recv()를 호출하면 문자열로 되돌아갑니다.