Как синхронизировать arraylist между потоками многопоточного сервера сокетов - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь создать клиент-серверное приложение без проблем с параллелизмом. В настоящее время я получаю поток данных от каждого клиента и сохраняю данные в списке массивов, затем на каждом сервере я зацикливаюсь на списке массивов и передаю информацию клиентам. Затем клиенты сопоставляют значения на основе информации о сервере, переданной им обратно (их имя и их цели). Есть ли лучший подход к синхронному обмену информацией между сокетами, я пытаюсь разделить около 7 переменных, которые каждый клиент имеет для каждого клиента, используя сервер в качестве централизованной точки.

public class Server {


    public static String StatusServer = "idle";
    public static ArrayList<String> AccountDetails = new ArrayList<>();

    public static void main(String args[]){

        Socket s=null;
        ServerSocket ss2=null;
        System.out.println("Server Listening......");
        try{
            ss2 = new ServerSocket(4445); // can also use static final PORT_NUM , when defined

        }
        catch(IOException e){
            e.printStackTrace();
            System.out.println("Server error");

        }

        while(true){
            try{
                s= ss2.accept();
                System.out.println("connection Established");
                ServerThread st=new ServerThread(s);
                st.start();
            }
            catch(Exception e){
                e.printStackTrace();
                System.out.println("Connection Error");

            }
        }

    }

}

class ServerThread extends Thread{

    String line=null;
    String line1;
    BufferedReader  is = null;
    PrintWriter os=null;
    Socket s=null;

    public ServerThread(Socket s){
        this.s=s;
    }

    public void run() {
        try{
            is= new BufferedReader(new InputStreamReader(s.getInputStream()));
            os=new PrintWriter(s.getOutputStream());

        }catch(IOException e){
            System.out.println("IO error in server thread");
        }

        try {
            line=is.readLine();
            if (line != null) {
                Server.AccountDetails.add(line);
            }
            while(line.compareTo("QUIT")!=0){
                line1 = line;
                int position = 0;
                for (String curVal : Server.AccountDetails){
                    String curVal1 = curVal.substring(0, 20);
                    String searchString =  line.substring(0, 6);
                    if (curVal1.contains(searchString)){
                        Server.AccountDetails.set(position, line);
                    }
                    position++;
                }
                os.println(Server.AccountDetails);
                os.flush();
                line=is.readLine();
                try
                {
                    Thread.sleep(250);//2 seconds
                }
                catch(InterruptedException ie){
                    ie.printStackTrace();
                }
            }
        } catch (IOException e) {

            System.out.println("IO Error/ Clientterminated abruptly");
        }
        catch(NullPointerException e){
            System.out.println("Client Closed");
        }

        finally{
            try{
                System.out.println("Connection Closing..");
                if(Server.AccountDetails.size() >0) {
                    int position = 0;
                    for (String curVal : Server.AccountDetails){
                        System.out.println(this.getName() + ": " +curVal);
                        String curVal1 = curVal.substring(0, 20);
                        System.out.println("Curval1 " +curVal1);
                        System.out.println("Line: "+line1);
                        String searchString =  line1.substring(0, 8);
                        System.out.println("Search String "+searchString);
                        if (curVal1.contains(searchString)){
                            System.out.println("Removing "+ Server.AccountDetails.get(position));
                            Server.AccountDetails.remove(position);
                        }
                        position++;
                    }
                }
                try
                {
                    Thread.sleep(250);//2 seconds
                }
                catch(InterruptedException ie){
                    ie.printStackTrace();
                }
                if (is!=null){
                    is.close();
                    System.out.println(" Socket Input Stream Closed");
                }

                if(os!=null){
                    os.close();
                    System.out.println("Socket Out Closed");
                }
                if (s!=null){
                    s.close();
                    System.out.println("Socket Closed");
                }

            }
            catch(IOException ie){
                System.out.println("Socket Close Error");
            }
        }//end finally
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...