Многопоточность в Java с использованием Socket - PullRequest
0 голосов
/ 03 июля 2019

У меня есть задача создать программу, которая имитирует принтер в локальной сети.В программе есть 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
}

Пожалуйста, помогите мне решить эту проблему.Спасибо

...