2013-07-23 2 views
2

15 초 동안 데이터를 보내는 생산자가 있습니다. 첫 번째 제작자가 이미 실행중인 동안 동일한 프로그램을 복제하고 다른 창에서 실행합니다. "사용중인 포트 3333을 이미 사용 중입니다."2 명의 제작자가 동시에 데이터를 전송합니다.

동일한 소켓에서 여러 개의 생성자 (다중 프로세스가 스레드되지 않음)를 만들려면 어떻게해야합니까? 그러나 나는 포트 3333이 그림에 들어오는 곳을 모른다.

내 프로그램에 어떤 문제가있을 수 있습니까? 원하는 경우 완전한 문제 설명을 제공 할 수 있습니다. 그러나 간단히 말해서 사용자 정의 Kafka Producer를 사용하여 데이터를 보내고 있으며 Kafka 제작자 두 명에게 데이터를 보내려고합니다.

+0

데이터를받는 프로세스는 어디에 있습니까? 3333 번 포트에서 들으시겠습니까? – Narkha

+0

Consumer 및 Producer의 소스를 제공 할 수 있습니까? 이를 통해 적절한 솔루션을 제공 할 수 있습니다. 내 대답은 정상적인 시나리오 작업과 오류가 발생하는 이유를 지적합니다. –

+0

@ NarendraPathai : 답변이 효과적입니다! 고마워요. ... – Dominix

답변

3

시작하려는 프로그램이 고정 포트 3333에서 연결을 수신하려고하고 두 번째 인스턴스를 시작하면 "이미 연결됨"오류가 발생합니다. 인수를 사용하여 포트를 변경하는 방법이 있는지 확인하십시오. 그러나 당신이 소스를 제공하지 않았기 때문에 나는 그것에 대해 언급 할 수 없다.

하지만 난 그냥 일이

한다고 가정 소비자가 포트 3333에서 수신 대기 정상적인 상황에서 어떻게 작동하는지 설명하기 위하여려고하고있다가, 다음은 서버가 해당 포트의 연결을 받아 들일 것입니다. 그리고 여러 클라이언트가

샘플 클라이언트 프로그램

BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 
Socket clientSocket = new Socket("localhost", 3333); //3333 is the port on which the server is listening 
DataOutputStream outToConsumer = new DataOutputStream(clientSocket.getOutputStream()); 
BufferedReader inFromConsumer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); //Only if consumer sends something in reply 
sentence = inFromUser.readLine(); 
outToServer.writeBytes(sentence + '\n'); 
modifiedSentence = inFromConsumer.readLine(); 

그래서 여러 생산자가 고객 수와 전용 포트에서 듣고있는 소비자에게 데이터를 전송합니다 서버에 해당 포트에 데이터를 보낼 수 있습니다. 여러 소비자가 동일한 소켓에서 수신 대기 할 수 없다는 것을 명심하십시오. 다른 소비자에 대해 서로 다른 포트 을 사용해야합니다.

+0

감사합니다 Narendra. +1. 수락 됨. – Dominix

+0

@Dominix 다행스럽게 도와주세요 :) –

1

연결 지향 프로토콜 (예 : TCP)을 사용하는 경우 서버는 일반적으로 보급 된 포트의 연결에만 listen 초입니다. 클라이언트가 connect이면 서버의 accept 호출은 효과적으로 임의의 다른 포트 번호로 연결되어 주 서버 스레드/프로세스가 보급 된 포트에서 새 연결을 계속 수신 할 수있게합니다.

데이터 그램 기반 프로토콜 (예 : UDP)을 사용하는 클라이언트는 지속적인 연결을 유지 관리하지 않기 때문에 이것은 문제가되지 않습니다.

두 가지 해결책 중 하나를 선택하는 것이 효과적 일 수 있습니다. 어느 것이 더 좋은지는 트래픽의 성격에 따라 다릅니다.

관련 문제