저는 잠시 동안 파고 들었습니다. 저는 잘 이해하고 있습니다. 나는 무엇을하려고하는지 정확히 알지 못합니다.어떤 클라이언트가 서버로 데이터를 전송하고 있는지 어떻게 알 수 있습니까?
여러 클라이언트가 연결되는 서버가 필요합니다. 가끔씩 클라이언트는 새로운 서버 집합 (기본적으로 분산 컴퓨팅)을 쿼리하여 서버가 쿼리 한 클라이언트로 다시 전송합니다.
다시 응답 할 수 있도록 서버를 쿼리 한 클라이언트를 어떻게 알 수 있습니까?
저는 Python을 처음 접했고 select() 함수 자체가 약간 혼란 스럽습니다. 나는 새로운 연결을 받아들이고 입력을 할 수 있지만 서버는 어떤 클라이언트가 그 클라이언트와 대화하고 있는지 알지 못한다. (아마도 내 디버깅 텍스트가 정확하지 않고 알 수있다.). 기본적으로이 명령의 일종을 수신하고 돌아 서서 그것을 필요로하는 데이터를 전송
while running:
#select returns 3 subsets of the input containing sockets that have stuff to be read, empty buffer for writing, or an error
readers, writers, error = select.select(input, output, errors)
for s in readers:
if s == serversocket:
#readable server socket is ready for connection
connection, client_addr = s.accept()
print >> sys.stderr, 'new connection from', client_addr
connection.setblocking(0)
#clients.append([client_addr, performance])
input.append(connection)
output.append(connection)
else:
#readable socket, not ready for new connection
data = s.recv(1024)
print >> sys.stderr, "readable socket, not ready for new connection"
if data:
#the socket actually has data (put Compute process data into list)
print >> sys.stderr, "Data received"
substring = data[0:data.find("sss")];
print >> sys.stderr, 'received %s from %s' % (substring, client_addr)
if substring == "-get":
print >> sys.stderr, 'received -get command'
determinerange()
print >> sys.stderr, 'sending range of %d to %d', currentlow, currenthigh
temp = currentlow+"\0"
connection.send(currentlow)
temp = currenthigh+"\0"
connection.send(currenthigh)
elif substring == "-k":
print >> sys.stderr, 'received -k, stopping'
:
어쨌든, 여기에 서버의 코드입니다. 당신이 궁금해하는 경우에,이 서버는 내가 실제로 쓰고있는 C 프로그램과 대화해야하는데, 실제로 계산을합니다. 그래서 "\ 0"개행 문자를 추가하고 있습니다. 클라이언트 중 하나에서 -k를 수신하면 모든 클라이언트를 중지하고 종료해야합니다.
참고 : 표준 파이썬 라이브러리 만 사용할 수 있습니다. 나는 물건을 더 쉽게 만들 수있는 여분의 것들을 얻을 수 없다 :)
미리 도움을 주셔서 감사합니다!
일반적으로 이와 비슷한 항목은 더 큰 프레임 워크 안에 있습니다. 소켓 연결의 설정은 한 단계가 될 것이고 미리 정의 된 일부 프로토콜을 기반으로 인증을 처리하는 다른 실행중인 프로세스 나 모듈로 라우트됩니다. 여기서 파이썬 네트워킹 객체는 여러분의 TCP 정보를 관리합니다. 예를 들어 accept()에서 반환 된 client_addr은 보낸 사람 IP를 제공합니다. –
예. 그리고 그 클라이언트에 데이터를 반환하기 전에 사용할 수 있지만 다른 클라이언트가 데이터를 그 클라이언트에게 보내기 전에 다른 연결이 발생하지 않는 경우에만 사용할 수 있습니다. 새 연결이 제공되면 client_addr을 최신 연결 클라이언트로 설정합니다. 그 사람에 대한 client_addr을 알지 못하고 데이터를 보낸 클라이언트에게 어떻게 데이터를 다시 보내는 지 궁금합니다. EJP는 단순히 동일한 소켓으로 다시 보내면 데이터를받을 때 클라이언트 정보도 포함된다는 의미일까요? 데이터를 전송하면 방금받은 데이터가 자동으로 선택됩니다. – FeralShadow
소켓 개체에 대한 참조는 고유 한 원격 서버와의 연결입니다. 당신은 기본적으로 원하는 바이트를 보내거나받을 수 있습니다. 양쪽 끝이 무엇을 할 것인가에 동의한다고 가정합니다. [http : //www.tutorialspoint.com/python/python_networking.htm] (http : //www.tutorialspoint.com/python/python_networking.htm) –