2017-09-08 2 views
0

서버 측 (publisher0)에서 데이터를 단일 클라이언트 (구독자)로 스트리밍하기 위해 2 개의 소켓 (다른 포트 포함)을 사용하고 싶습니다. 각 소켓은 센서 중 하나에서 데이터를 스트리밍합니다 : 센서의 샘플링 속도가 다릅니다. 내가이 특정 사례에 대한 시작 코드를 찾을 수 없었으므로, select를 사용하라는 제안에 대한 답변을 찾았습니다. 아래 코드는 지금까지 가지고있는 코드입니다. : 2 개 파일을 시작한 후, 코드는 가입자와 게시자 측 모두에 달려 아무것도 인쇄되지다중 소켓 (비동기)

publisher.py

import socket 
import select 

sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock1.bind(('', 23000)) 
sock2.bind(('', 23001)) 

sock1.listen(1) 
sock2.listen(1) 
clisock1, (remhost, remport) = sock1.accept() 
clisock2, (remhost, remport) = sock2.accept() 
clisocks = [clisock1, clisock2] 
while 1: 

    ready_socks,_,_ = select.select(clisocks, [], []) 
    for sock in ready_socks: 

     sock.send(b"Hello World\n") 

clisock1.close() 
clisock2.close() 
. 617,451,515,

subscriber.py

import socket 
import select 

sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

sock1.connect(('', 23000)) 
sock2.connect(('', 23001)) 

socks = [sock1, sock2] 

while True: 
    ready_socks,_,_ = select.select(socks, [], []) 
    for sock in ready_socks: 
     data, addr = sock.recvfrom(100) # This is will not block 
     print("received message:", data) 

내가 손해를보고 나는, 나는 매우 몇 가지 제안을 부탁드립니다.

답변

1

당신이 직면 한 문제는 송신 소켓을 잘못된 목록에 넣기 때문입니다. select.select()에는 수신 목록과 전송 목록의 두 가지 목록이 있습니다. 두 번째 반환에 따라서, 대신 송신 소켓이 두 번째 인수 준비 소켓으로 입력

_,ready_socks,_ = select.select([], socks, []) 

을 읽을 수있는publisher.py에 선

ready_socks,_,_ = select.select(socks, [], []) 

를 업데이트 할 필요가 있습니다 값. 이를 업데이트하면 프로그램이 작동합니다. 그러나 프로그램에 지체가 없으므로 많은 양의 메시지를 신속하게 보내 게됩니다. 또한, 서면으로, 귀하의 두 채널을 구별 할 수있는 방법이 없습니다. 나는 당신이 당신의 예를 줄이기 때문이라고 생각합니다.

+0

고맙습니다. +100. 당신이 제안한 변화를 만들었습니다. 코드가 작동 중입니다. – JMarc