2

我有一个生产者发送数据 15 秒。我只是复制相同的程序并在第一个生产者已经运行时从不同的窗口运行它。我得到“端口 3333 已在使用中,java.net.BindException:地址已在使用中”

如何让多个生产者(多进程非线程)在同一个套接字上发送数据?但是我不知道端口 3333 是从哪里出现的。

我的程序可能有什么问题?如果需要,我可以提供完整的问题陈述。但是简而言之,我正在使用自定义 Kafka Producer 来发送数据,并且我想要两个这样的 Kafka Producer 来发送数据。

4

2 回答 2

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();

因此,多个生产者将成为客户端,并将数据发送给正在侦听专用端口的消费者。请记住,多个消费者将无法在同一个套接字上监听,您将不得不为不同的消费者使用不同的端口

于 2013-07-23T08:10:45.647 回答
1

如果您有一个面向连接的协议(例如 TCP),服务器通常只listen用于广告端口上的连接。当客户端connects 时,服务器的accept调用会导致在有效的随机其他端口号上建立连接,从而允许主服务器线程/进程继续侦听广告端口上的新连接。

对于基于数据报的协议(例如 UDP),这不是问题,因为没有客户端维护持久连接。

任何一种解决方案都可以为您工作——更喜欢哪一种取决于流量的性质。

于 2013-07-23T08:37:13.823 回答