2013-07-23 2 views
2

У меня есть производитель, отправляющий данные в течение 15 секунд. Я просто реплицирую ту же программу и запускаю ее из другого окна, пока первый производитель уже работает. Я получаю «порт 3333, который уже используется, java.net.BindException: адрес уже используется»Два производителя одновременно отправляют данные

Как я могу сделать несколько продюсеров (многопроцессорных, не поточных) отправлять данные в одном сокете? Однако я не знаю, откуда порт 3333 входит в картину.

Что может быть неправильно с моей программой? При желании я могу предоставить полное описание проблемы. Однако, короче говоря, я использую собственный производитель Kafka для отправки данных, и я хочу, чтобы два таких Kafka Producers отправили данные.

+0

Где находится процесс получения данных? Возможно, прослушивание в порту 3333? – Narkha

+0

Можете ли вы предоставить источник для потребителя и производителя? Это позволит нам предоставить вам правильное решение. Мой ответ указывает на работу нормальных сценариев и на то, почему вы получаете ошибку. –

+0

@NarendraPathai: Ваш ответ сработал! Спасибо тонну ... – Dominix

ответ

3

Я предполагаю, что программа, которую вы запускаете, пытается прослушивать соединения на фиксированном порту 3333, а когда вы запускаете второй экземпляр, она дает ошибку «Уже привязана». Посмотрите, есть ли способ изменить этот порт, используя некоторые аргументы. Но я не могу прокомментировать это, поскольку вы не предоставили никакого источника.

Но я просто хочу, чтобы объяснить, как это работает в нормальных сценариев

Предположим, что потребитель прослушивает порт 3333, то он станет сервер и принимает соединения на этот порт. И несколько клиентов могут передавать данные на этот порт на сервере

Sample Client Программа

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

Спасибо Нарендра. +1. Принято. – Dominix

+0

@ Dominix Рад помочь :) –

1

Если у вас есть протокол, ориентированный на соединение (например, TCP), сервер обычно только listen s для соединений на рекламируемом порту. Когда клиент connect s, вызов сервера accept приводит к соединению с эффективным случайным другим номером порта, позволяя основному потоку/процессу сервера продолжать прослушивание новых подключений на рекламируемом порту.

С протоколом на основе дейтаграмм (например, UDP) это не проблема, потому что ни один клиент не поддерживает постоянное соединение.

Любое решение может сработать для вас - от кого зависит предпочтение от характера трафика.

Смежные вопросы