在 java 回调中发送多个文件?
Sending multiple files in java callback?
如何添加到发送队列,例如我用JFileChooser选择一个文件,然后在一个新的线程中将它发送给客户端,我想选择另一个并发送它。发生的情况是它同时发送文件并且客户端的输出被破坏。
我希望能够添加到某种 "queue",以便在发送第一个文件时,服务器将开始发送下一个文件。
服务器-> 客户端之间 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
}
});
您甚至可以将 Socket 信息与线程一起存储,并将其传递给任务接口,如果您希望 sendFile
方法将其作为参数接收。
如何添加到发送队列,例如我用JFileChooser选择一个文件,然后在一个新的线程中将它发送给客户端,我想选择另一个并发送它。发生的情况是它同时发送文件并且客户端的输出被破坏。
我希望能够添加到某种 "queue",以便在发送第一个文件时,服务器将开始发送下一个文件。
服务器-> 客户端之间 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
}
});
您甚至可以将 Socket 信息与线程一起存储,并将其传递给任务接口,如果您希望 sendFile
方法将其作为参数接收。