简体   繁体   中英

android socket client/server disconnect

I'm writing a simple client server for android, it works super until I reran the client. Then nothing happens. The server runs continuously and the client must be connected and disconnected. Any some help would be very useful. Thank you.

Server

public class MyService extends Service {

 String line = null;
    String temp_comand = null;
    Socket client;

    public static String SERVERIP = "10.0.2.15";
    public final static int DISPATCH_KEY_FROM_IME = 1011;

    public static final int SERVERPORT = 8080;

    private Handler handler = new Handler();

    private ServerSocket serverSocket;

@Override
public IBinder onBind(Intent intent) {

    return null;
}

@Override
public void onCreate() {
    Log.i("SERVISE", "STARTED");

      SERVERIP = getLocalIpAddress();

        Thread fst = new Thread(new ServerThread());
        fst.start();

}


 public class ServerThread implements Runnable {

        public void run() {
            try {
                if (SERVERIP != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {

                            Log.v("wlan0", Utils.getMACAddress("wlan0"));
                            Log.v("eth0", Utils.getMACAddress("eth0"));
                            Log.v("<< IP4 >>", Utils.getIPAddress(true)); 
                            Log.v("<< IP6 >>", Utils.getIPAddress(false));
                        }
                    });
                    serverSocket = new ServerSocket(SERVERPORT);
                    while (true) {
                        // LISTEN FOR INCOMING CLIENTS
                        client = serverSocket.accept();
                        handler.post(new Runnable() {
                            @Override
                            public void run() {


                            }
                        });

                        try {
  BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));

                            while ((line = in.readLine()) != null) {
                                Log.d("ServerActivity", line);
                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {


                                        if (line.equals("next")){
                                            simulateKey(22);

                                        }
                                            if (line.equals("beack")){
                                            simulateKey(21);

                                        }
                                            if (line.equals("up")){
                                            simulateKey(19);

                                        }
                                            if (line.equals("down")){
                                            simulateKey(20);

                                        }
                                            if (line.equals("ok")){
                                            simulateKey(23);

                                        }
                                            if (line.equals("power")){
                                            simulateKey(170);

                                        }
                                            if (line.equals("exit")){
                                            simulateKey(4);

                                        }
                                            if (line.equals("vol_m")){
                                            simulateKey(25);

                                        }
                                            if (line.equals("vol_up")){
                                            simulateKey(24);

                                        }
                                            if (line.equals("menu")){
                                            simulateKey(82);

                                        }
                                            if (line.equals("left")){
                                            simulateKey(88);

                                        }
                                            if (line.equals("right")){
                                            simulateKey(87);

                                        }
                                            if (line.equals("home")){
                                                simulateKey(3);

                                            }
                                            if (line.equals("close")){
                                                simulateKey(4);

                                            }


                                          //  Log.d("ServerActivity", line);

                                    }
                                });
                            }
                            break;
                        } catch (Exception e) {
                            handler.post(new Runnable() {
                                @Override
                                public void run() {

                                }
                            });
                            e.printStackTrace();
                        }
                    }
                } else {
                    handler.post(new Runnable() {
                        @Override
                       public void run() {
                        }
                    });
                }
            } catch (Exception e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                    }
                });
                e.printStackTrace();
            }
        }
    }

    private String getLocalIpAddress() {
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
                NetworkInterface intf = en.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); }
                }
            }
        } catch (SocketException ex) {
            Log.e("ServerActivity", ex.toString());
        }
        return null;
    }






    public  void simulateKey(final int KeyCode) {

        new Thread() {
            @Override
            public void run() {
                try {
                    Instrumentation inst = new Instrumentation();
                    inst.sendKeyDownUpSync(KeyCode);
               } catch (Exception e) {
                    Log.e("Exception when sendKeyDownUpSync", e.toString());
                }
            }

        }.start();
    }



       }

Client

public class ClientActivity extends Activity {


String comand = "Жду команду";
private Button  right, left, up, dn, menu, pow, min, plus, ok, sw_l, sw_r, close, home;

private String serverIpAddress = "";
 String serverIp;
 Socket socket;
private boolean connected = false;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    setContentView(R.layout.client);







    final WifiManager manager = (WifiManager) super.getSystemService(WIFI_SERVICE);
    final DhcpInfo dhcp = manager.getDhcpInfo();
    serverIp = Formatter.formatIpAddress(dhcp.gateway);

    if (!connected) {
        serverIpAddress = serverIp;
        if (!serverIpAddress.equals("")) {
            Thread cThread = new Thread(new ClientThread());
            cThread.start();
        }
    }



    right = (Button) findViewById(R.id.btn_right);
    left = (Button) findViewById(R.id.btn_left);
    up= (Button) findViewById(R.id.btn_up);
    dn= (Button) findViewById(R.id.btn_dn);
    menu= (Button) findViewById(R.id.btn_menu);
    pow= (Button) findViewById(R.id.btn_pow);
    min= (Button) findViewById(R.id.btn_min);
    plus= (Button) findViewById(R.id.btn_plus);
    ok= (Button) findViewById(R.id.btn_ok);
    sw_l= (Button) findViewById(R.id.btn_sw_left);
    sw_r= (Button) findViewById(R.id.btn_sw_rig);
    close = (Button) findViewById(R.id.btn_close);
    home= (Button) findViewById(R.id.btn_home);

    Log.e("KeyEvent.KEYCODE_HOME", String.valueOf(KeyEvent.KEYCODE_HOME));




    right.setOnClickListener(new View.OnClickListener() {
     @Override
        public void onClick(View v) {
        comand = "next";
     }});

    left.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            comand = "beack";
     }});
     up.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
        comand = "up";
 }});
     dn.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
        comand = "down";
 }});
     menu.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
    comand = "menu";
 }});
     pow.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
    comand = "power";
 }});
     min.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
    comand = "vol_m";
 }});
     plus.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
    comand = "vol_up";
 }});
     ok.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
    comand = "ok";
 }});
     sw_l.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
    comand = "left";
 }});
    sw_r.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
    comand = "right";
 }});

        home.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        comand = "home";
     }});
           close.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        comand = "close";
     }});

}






public class ClientThread implements Runnable {

    public void run() {

        try {
            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            Log.d("ClientActivity", "C: Connecting...");
            socket = new Socket(serverAddr, 8080);

            connected = true;
            while (connected) {
                try {

            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
                                .getOutputStream())), true);

                    if(out.checkError())
                    {Log.d("ClientActivity", "Error transmitting data");
                        throw new Exception("Error transmitting data.");
                    }  


                        if (comand.equals("next")){
                        out.println(comand);
                        comand = "Жду";
                    }
                        if (comand.equals("beack")){
                            out.println(comand);
                            comand = "Жду";
                    }
                        if (comand.equals("up")){
                        out.println(comand);
                        comand = "Жду";
                    }
                        if (comand.equals("down")){
                        out.println(comand);
                        comand = "Жду";
                    }
                         if (comand.equals("ok")){
                         out.println(comand);
                         comand = "Жду";
                    }
                         if (comand.equals("power")){
                         out.println(comand);
                         comand = "Жду";
                    }
                         if (comand.equals("exit")){
                         out.println(comand);
                         comand = "Жду";
                    }
                          if (comand.equals("vol_m")){
                          out.println(comand);
                          comand = "Жду";
                    }
                          if (comand.equals("vol_up")){
                          out.println(comand);
                          comand = "Жду";
                    }
                          if (comand.equals("menu")){
                          out.println(comand);
                          comand = "Жду";
                    }
                         if (comand.equals("left")){
                          out.println(comand);
                          comand = "Жду";
                    }
                          if (comand.equals("right")){
                          out.println(comand);
                          comand = "Жду";
                    }
                          if (comand.equals("home")){
                              out.println(comand);
                              comand = "Жду";
                        }
                          if (comand.equals("close")){
                              out.println(comand);
                              comand = "Жду";
                        }




                } catch (Exception e) {
                    Log.e("ClientActivity", "S: Error", e);
                }
            }
            socket.close();
            Log.d("ClientActivity", "C: Closed.");
        } catch (Exception e) {
            Log.e("ClientActivity", "C: Error", e);
            connected = false;

        }






    }
}

protected String wifiIpAddress(Context context) {
    WifiManager wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE);
    int ipAddress = wifiManager.getConnectionInfo().getIpAddress();

    // Convert little-endian to big-endianif needed
    if (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) {
        ipAddress = Integer.reverseBytes(ipAddress);
    }

    byte[] ipByteArray = BigInteger.valueOf(ipAddress).toByteArray();

    String ipAddressString;
    try {
        ipAddressString = InetAddress.getByAddress(ipByteArray).getHostAddress();
    } catch (UnknownHostException ex) {
        Log.e("WIFIIP", "Unable to get host address.");
        ipAddressString = null;
    }

    return ipAddressString;
}


}

If the client does not disconnect the server stays in this loop: while ((line = in.readLine()) != null) waiting and waiting for the next line. In the mean time no other client can connect.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM