我试图将单个输入流的内容推送到从tcp套接字获得的多个输出流。我没有找到任何现有的解决方案,所以我从零开始构建了一些东西,但我真的觉得我正在重新发明轮子。我的要求是:
那么,首先,是否有满足这些要求的库?
如果没有,我如何改善自己的解决方案的性能(见下文)。我这样用它:
虽然它可以正常工作,但每个连接了N个客户端的客户端的吞吐量极不稳定。似乎没有关于N的吞吐量功能。(免责声明:我使用多个线程从单个客户端测试)我认为这个解决方案的性能主要受两件事的影响:
我会感谢任何建议,谢谢。
public class InfiniteStreamingResource implements Runnable {
private LinkedHashSet<OutputStream> consumers;
private byte[] buf;
private boolean running;
InputStream stream;
Logger logger = Logger.getLogger(InfiniteStreamingResource.class);
public InfiniteStreamingResource(InputStream stream, int bufSize) {
this.stream = stream
consumers = new LinkedHashSet<>(100);
buf = new byte[bufSize];
}
public synchronized void attachConsumer(OutputStream consumer) {
consumers.add(consumer);
}
public synchronized void stop() {
running = false;
}
@Override
public void run() {
running = true;
int bytesRead;
Iterator<OutputStream> it;
OutputStream current;
try {
while ((bytesRead = stream.read(buf)) > 0 && running) {
synchronized(this) {
it = consumers.iterator();
while (it.hasNext()) {
current = it.next();
try {
current.write(buf, 0, bytesRead);
} catch (IOException e) {
if (e instanceof SocketException) {
it.remove();
try {
current.close();
} catch (IOException inner) {
//ignore
}
} else {
e.printStackTrace();
}
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
for (OutputStream consumer : consumers) { //if stopped, close any remaining streams
try {
consumer.close();
} catch (IOException e) {
//ignore
}
}
}
}
答案 0 :(得分:0)
我会根据您要发送的数据来决定。
如果是原始字节数据(例如视频流),我不知道库。
对于文本或Java对象,使用RabbitMQ 因此,您需要安装Broker。这可以从您的发布者接收消息并将其转发给所有订阅的客户端。
易于实现(也在Android中)。