2014-10-07 2 views
0

나는이 일을 잘하고 있는지 잘 모르겠지만 정상적인 TCP 연결에서 ZMQ를 실행하는 서버에 메시지를 보내고 싶습니다. 서버는 TCP transport을 사용하여 포트 5555에서 Python ZMQ를 실행하고 있습니다. 나는 전통적인 TCP를 사용하는 다른 클라이언트 (Python, Java, PHP)를 사용하여 메시지를 보낼 수 있기를 원한다. 이것은 내가 지금까지 무엇을 가지고 :기존의 TCP를 사용하여 ZeroMQ 서버에 메시지를 보낼 수 있습니까?

서버에

context = zmq.Context() 
socket = context.socket(zmq.REP) 
socket.bind("tcp://*:5555") 

while True: 
    message = socket.recv() 
    print message 
    socket.send('{"name":"someone"}') 

CLIENT

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(('127.0.0.1', 5555)) 
s.send('Hello, World!') 
data = s.recv(1024) 
print data 

클라이언트에서 인쇄 data 나에게 내가 기대하고있는 메시지를 제공하지 않습니다. 나는 이것을 얻는다 : . 나는 바이트의 배열했다 얻고 무엇을 생각 bytes(data).decode('utf8') 일을했지만, 나는 다음과 같은 오류 얻을 : 난 그냥 궁금

UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128) 

을이 전혀 가능합니까? 아니면 내가 잘못하고있는거야? 또한 추천입니까?

클라이언트에서 ZMQ를 사용하지 않은 이유는 종속성의 수를 줄이려는 것입니다 (ZeroMQ가 하나임).

도움 주셔서 감사합니다.

답변

4

ZeroMQ는 기술적으로 ZMTP가 프로토콜이며, 0MQ는 ZMTP 프로토콜을 구현하는 라이브러리이며 ZeroMQ는 0MQ의 Python 구현입니다. 모든 시그널링과 모든 프레이밍 (바이트 스트림을 별도의 메시지로 나누기)은 소켓을 통해 바이트를 전송하여 수행됩니다. ZeroMQ 시그널링과 프레이밍을하는 법을 모르는 클라이언트는 단지 많은 쓰레기를 볼 것입니다.

당신이하려는 것은 정확하게 HTTP에 대해 알지 못하고 소켓을 읽는 웹 클라이언트를 작성하는 것과 같습니다. 당신은 당신이 무엇을 해야할지 모르는 것들을 골라 낼 것입니다. 유일한 차이점은 HTTP의 경우 프레이밍이 때때로 데이터 앞에 오는 사람이 읽을 수있는 ASCII 묶음 일 뿐이지 만 (항상 그런 것은 아니며 MIME 봉투, gzip 전송 인코딩, 청크 분할 전송 등이 가능함) ZMTP로가있는 동안 결코 사람이 읽을 수있는 ...

는 일반 TCP 소켓을 통해 데이터를 전송하려는 경우 해당 서버 측에서 일반 TCP 소켓을 만들고 호출하여해야 할

send (또는 sendall, 등) 방법. ZMTP 채널을 통해 데이터를 보내려면 ZMTP를 구문 분석하거나 클라이언트 측에서 ZeroTP와 같은 라이브러리 (ZeroMQ 등)를 사용하여 데이터를 전송해야합니다.

ZMTP와 달리 TCP는 메시지 지향 프로토콜이 아닙니다. 모든 TCP 전송은 바이트 스트림입니다. 수신 측에서는 한 전송이 끝나고 다음 전송이 시작될 때를 알 수있는 방법이 없습니다. 그래서, "요청을 보내고, 응답을 얻고,"전화를 끊어야하는 거의 모든 것을 위해, 당신은 당신 자신의 일종의 프레이밍을 작성해야합니다. "메시지는 개행 문자가없는 문자열이며 각 메시지는 개행 문자로 구분됩니다 (이 경우에는 socket.makefile 만 사용할 수 있습니다). 그러나 종종 메시지 형식이 더 복잡하거나 단순한 데이터가 아닌 "명령"을 보내야합니다.

tdelaney's 답변이 삭제되었습니다. (10K 담당자 이하의 사람에게는 보이지 않는다는 의미이므로) 유용한 제안 사항이 있습니다. 크레딧을 제시하여 여기까지 반복하겠습니다. (ZeroMQ 라이브러리 사용) ZMTP를 서버에 연결하지만 클라이언트에게 간단한 TCP 기반 프로토콜을 말하는 미들웨어를 작성하십시오. ZeroMQ는 특별히 합리적으로 쉽게 만들 수 있도록 설계되었습니다. tdelaney가 말했듯이, "레고처럼, 서로 다른 의사 소통 부분을 구축하여 견고한 통신 인프라를 구축합니다. 모든 부분이 zeromq 일 필요는 없습니다."

+0

고마워요! 이것이 바로 내 문제였습니다. 나는 양측 모두에서 일반 TCP를 사용할 것을 고려할 것이다. – Sthe

관련 문제