如何添加到发送队列,例如我选择带有JFileChooser的文件,然后将其以新线程发送到客户端,我想选择另一个并发送它。会发生什么是它同时发送文件并且客户端的输出被破坏。
我希望能够添加某种“队列”,以便在发送第一个文件时,服务器将开始发送下一个文件。
答案 0 :(得分:1)
服务器 - >客户端之间socket communication
的良好方法是每个客户端有1个线程,并且从java.util.concurrent.BlockingQueue
读取此线程。这样的接口是理想的(就像所有 java.util.concurrent 对象一样),用于管理多线程并发。
这个想法是服务器有这样的ClientThread
:
class BroadCastThread extends Thread{
LinkedBlockingQueue<SendFileTask> bcQueue = new LinkedBlockingQueue<>();
@Override
public void run() {
while( true ){
try {
SendFileTask task = bcQueue.take();
task.sendFile();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
void addTask(SendFileTask rt) throws InterruptedException{
bcQueue.put(rt);
}
}
interface SendFileTask{
void sendFile() throws Exception;
}
并通过adding tasks
使用此线程对象:
BroadCastThread bct = new BroadCastThread();
bct.start();
//With lambda
bct.addTask(() -> {
//Send file code
});
//Without lambda
bct.addTask(new SendFileTask() {
@Override
void sendFile() throws Exception {
//Send file code
}
});
如果您希望sendFile
方法将其作为参数接收,您甚至可以将Socket信息与线程一起存储,然后传递它抛出任务界面。