我有一个生产者发送数据15秒。我只是复制相同的程序,并在第一个生产者已经运行时从不同的窗口运行它。我得到“端口3333已在使用中,java.net.BindException:地址已在使用中”
如何让多个生产者(多进程无线程)在同一个套接字上发送数据?但是我不知道端口3333在哪里出现。
我的计划可能出现什么问题?如果需要,我可以提供完整的问题陈述。但总之,我使用自定义Kafka Producer发送数据,我希望两个这样的Kafka Producer发送数据。
答案 0 :(得分: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();
因此,多个生产者将成为客户并将数据发送给正在侦听专用端口的消费者。请记住,多个消费者将无法在同一个套接字上收听, 您必须为不同的消费者使用不同的端口。
答案 1 :(得分:1)
如果您有面向连接的协议(例如TCP),则服务器通常仅listen
用于广告端口上的连接。当客户端connect
时,服务器的accept
调用会有效地连接一个随机的其他端口号,允许主服务器线程/进程继续侦听通告端口上的新连接。
使用基于数据报的协议(例如UDP),这不是问题,因为没有客户端维持持久连接。
任何一种解决方案都可以为您服务 - 首选哪种解决方案取决于流量的性质。