У меня есть задача создать программу, которая имитирует принтер в локальной сети.В программе есть 3 очереди, которые описывают 3 доступных принтера.Каждая очередь позже будет иметь поток.Когда клиент подключается к серверу, он будет зацикливаться, пока клиент не введет тот же текст.Когда клиент отправляет текст на сервер для печати, система вводит этот текст в самую короткую очередь.Я не уверен насчет размещения метода thread.start для очереди.Если я помещу его в класс сервера, элемент очереди не изменится, что приведет к добавлению текста для печати в классе ClientHandler.Если я помещу его в класс ClientHandler, элемент очереди только для этого конкретного клиента.Это мой код до сих пор.он просто зависает после setArray метода.
Server.java
public class Server{
public static void main(String[] args) throws IOException {
ArrayList<Printer> queue = new ArrayList<>();
queue.add(new Printer(1));
.........
ServerSocket ss = new ServerSocket(5056);
while (true){
Socket s = null;
try {
s = ss.accept();
Runnable ch = new ClientHandler(s,queue);
new Thread(ch).start();
}catch (Exception e){
.....
}
}
}
}
ClientHandler.java
class ClientHandler implements Runnable{
final DataInputStream dis;
final DataOutputStream dos;
final Socket s;
ArrayList<Printer> queue;
//constructor
@Override
public void run(){
String received;
Thread t1 = new Printer(queue.get(0).getid(),queue.get(0).getQueue());
t1.start();
//and the other queue
while (true){
try {
received = dis.readUTF();
if(received.equals("Exit")){
//exit
}
Message msg = new Message(received,this.s);
Printer pr = queue.get(0); //example the first queue selected
pr.Addqueue(msg);
setArray(pr);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public synchronized void setArray(Printer pr){
this.queue.set(0,pr); //add new request to queue
}
}
Printer.java
class Printer extends Thread{
private int id;
private LinkedList queue = new LinkedList();
public synchronized void Addqueue(Message ps){
this.queue.addLast(ps);
}
public synchronized void delfirst(){
this.queue.remove(0);
}
@Override
public void run(){
String received;
while(true){
try{
while(this.queue.size()!=0){ //process if queue not null
Message ps = (Message)this.queue.get(0);
Socket l = ps.getSocket();
received = ps.getMessage();
DataOutputStream dos = new DataOutputStream(l.getOutputStream());
dos.writeUTF("Printing "+received);
thread.sleep(1000);
this.delfirst();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Message.java
public class Message {
private String message;
private Socket s;
//contrustor and getter setter
}
Пожалуйста, помогите мне решить эту проблему.Спасибо