0

私は、クライアントがアンドロイドに常駐し、サーバーがデスクトップに常駐するソケットプログラミングを行いました.......クライアントが接続を失ったことを知っているため、サーバーがダウンしているときはいつでも.....接続するまでループしますサーバ.......

ここで問題は以下のコードにあります

tabletclient = new Socket(SERVER_IP, TAB_SERVER_PORT);

接続が失われた場合のwhileループで........しかし、接続が再びオンになると、新しいオブジェクトが作成されます........

どなたかこの問題の解き方を教えてください........

クライアント側で

while(true){
        try {

            tabletclient = new Socket(SERVER_IP, TAB_SERVER_PORT);

            tabletout = new PrintWriter(tabletclient.getOutputStream());
            in = new Scanner(tabletclient.getInputStream());
            try
            {
                if((line = in.nextLine())!=null)
                {
                    // my task to be done 
                }
            }catch(Exception d){
                System.out.println("Connection from server has lost.........tabletclient.isConnected()----->"+tabletclient.isConnected());

            }
            } catch (UnknownHostException e) {  System.out.println("Entered 2.........");
            } catch (IOException e) {  System.out.println("Entered 3.........");e.printStackTrace();
            }
         }

サーバー側で

:
:
       private Set <Socket> TABhs=new HashSet<Socket>();
:
:
        new Thread(new TABServerThread()).start(); // runs in background
:
:
:
 class ServerThread implements Runnable {
        private ServerSocket server;

        @Override
        public void run() {
            try {
                server = new ServerSocket(SERVER_PORT);
                System.out.println("Server Start the server at port " + SERVER_PORT
                        + " and waiting for clients...");
                while (true) {
                    Socket socket = server.accept();
                    System.out.println("Server Accept socket connection: "
                                    + socket.getLocalAddress());
                      new Thread(new ClientHandler(socket)).start();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

private static PrintWriter out;

    class ClientHandler implements Runnable {

        private Socket clientSocket;

        private Scanner in;

        public ClientHandler(Socket clietSocket) {
            this.clientSocket = clietSocket;
        }

        @Override
        public void run() {
            try {
                out = new PrintWriter(clientSocket.getOutputStream());
                in = new Scanner(clientSocket.getInputStream());
                String line;
                System.out.println("ClientHandlerThread Start communication with : "+ clientSocket.getLocalAddress());
                try{
                while((line = in.nextLine()) != null) {
                    System.out.println("ClientHandlerThread Client says: " + line);
                    String dat[]=line.split("#");
                        String query="insert into table_orders (tableno,kotno, orders,status) values('"+dat[1]+"','"+dat[0]+"','"+dat[2]+"','pending')";
                        try {
                            int i= dbGetDet.insertDetails(query);
                            if(i>0)
                            {
                             fillTable();
                             filtercomboBox();
                             out.print("success");
                             out.flush();
                             for(Socket so:TABhs)
                             {
                                PrintWriter ot = new PrintWriter(so.getOutputStream());
                                ot.println("tableallocation#"+dat[1]);
                                ot.flush();
                             }
                                System.out.println("SENDED 'SUCCESS' TO CLIENT");
                            }
                        } catch (Exception ex) {
                            Logger.getLogger(MYClientclass.class.getName()).log(Level.SEVERE, null, ex);
                        } 
                   // }
                }
                }catch(Exception r){}
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }

サーバーのボタンクリックで

String stat=status_combo.getSelectedItem().toString();
  String tables=tableno_combo.getSelectedItem().toString();
  String kotno=kotno_combo.getSelectedItem().toString();
  if(stat.equals("Processing"))
  {
        try {
            TABhs = new CopyOnWriteArraySet(TABhs);
            int soint=1;
            System.out.println("TABhs Processing--------------------->"+TABhs.size());
            for(Iterator <Socket> it=TABhs.iterator();it.hasNext();)
            { 
                Socket so=it.next();
                System.out.println("SEEE SOCKET Processing"+soint+"----->"+so.isClosed());
                PrintWriter ot = new PrintWriter(so.getOutputStream());
                ot.println("tableupdate#"+tables+"#"+kotno+"#processing");
                ot.flush();
                JOptionPane.showMessageDialog(rootPane, "<html><body>Table Kot Status Changed to <b>Processing</b></body></html>");
                soint++;
            }

            System.out.println("TABhs Processing--------------------->"+TABhs.size());
            }
            catch (Exception ex) {
            Logger.getLogger(MYClientclass.class.getName()).log(Level.SEVERE, null, ex);
            }
    } 

ボタンがクリックされるたびに、出力は以下のようになります

最初のクリック

SEEE SOCKET Ready 1----->false
Server Accept socket connection: /192.168.1.74
SEEE SOCKET Ready 2----->false
TABhs--------------------->2

2 回目のクリック

SEEE SOCKET Ready 1----->false
SEEE SOCKET Ready 2----->false
Server Accept socket connection: /192.168.1.74
SEEE SOCKET Ready 3----->false
TABhs--------------------->4

4 回目のクリック

SEEE SOCKET Ready 1----->false
SEEE SOCKET Ready 2----->false
SEEE SOCKET Ready 3----->false
Server Accept socket connection: /192.168.1.74
SEEE SOCKET Ready 4----->false
TABhs--------------------->5
4

1 に答える 1