приложение для Android, сокеты отправлять только в первый раз - PullRequest
2 голосов
/ 23 ноября 2011

У меня есть Android-клиент, который прослушивает датчики смартфона, и когда он обнаруживает изменение значения датчика, он генерирует строку («команду») и создает сокет и выходной поток для отправки строки в Java. сервер; каждый слушатель датчика создает сокет с портом, отличным от других слушателей. У меня также есть кнопка «Отправить» и текстовое поле для отправки любой другой строки на сервер. Проблема в том, что хотя кнопка «отправить» работает нормально и отправляет все строки, записанные в текстовом поле, каждый раз, когда я нажимаю ее, каждый слушатель отправляет «команду» только в первый раз, когда обнаруживает изменение значений датчиков.

//listener buttonSend
Button.OnClickListener buttonSendOnClickListener = new Button.OnClickListener()
{

    @Override
    public void onClick(View arg0) 
    {
        buttonSend.setEnabled(false);
        Socket socket = null;
        DataOutputStream dataOutputStream = null;
        DataInputStream dataInputStream = null;

        try 
        {
            socket = new Socket(IP, 32450);
            socket.setReuseAddress(true);
            socket.setSoTimeout(2000);
            dataOutputStream = new DataOutputStream(socket.getOutputStream());
            dataInputStream = new DataInputStream(socket.getInputStream());
            dataOutputStream.writeUTF(textOut.getText().toString());
            textIn.setText(dataInputStream.readUTF());
        } 
        catch (UnknownHostException e) 
        {
            e.printStackTrace();
            buttonSend.setEnabled(true);
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
            buttonSend.setEnabled(true);
        }
        finally
        {
            if (socket != null)
            {
                try 
                {
                    buttonSend.setEnabled(true);
                    socket.close();
                } 
                catch (IOException e) 
                {
                    e.printStackTrace();
                    buttonSend.setEnabled(true);
                }
            }

            if (dataOutputStream != null)
            {
                try 
                {
                    dataOutputStream.close();
                } 
                catch (IOException e) 
                {
                    e.printStackTrace();
                }
            }

            if (dataInputStream != null)
            {
                try 
                {
                    dataInputStream.close();
                } 
                catch (IOException e) 
                {
                    e.printStackTrace();
                }
            }
        }
    }
}; //End listener buttonSend

это была кнопка, и все датчики работают так:

//proximity sensor event listener
SensorEventListener proximitySensorEventListener 
    = new SensorEventListener()
    {
        public void onAccuracyChanged(Sensor arg0, int arg1) 
        {
            // TODO Auto-generated method stub  
        }

        public void onSensorChanged(SensorEvent arg0) 
        {
            // TODO Auto-generated method stub              
            if(arg0.sensor.getType()==Sensor.TYPE_PROXIMITY && IP!="")
            {

                textProximitySensorData.setText("Proximity Sensor Value:" 
                        + String.valueOf(arg0.values[0]));

                String proxValue = "Proximity Sensor: VALUE " 
                        + String.valueOf(arg0.values[0]);
                if(buttonSend.isEnabled()==true){
                    Socket socket = null;
                    DataOutputStream dataOutputStream = null;
                    try 
                    {
                        socket = new Socket(IP, 32452);
                        socket.setReuseAddress(true);
                        socket.setSoTimeout(2000);
                        dataOutputStream = new DataOutputStream(socket.getOutputStream());
                        dataOutputStream.writeUTF(proxValue);
                    } 
                    catch (UnknownHostException e) 
                    {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } 
                    catch (IOException e) 
                    {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    finally
                    {
                        if (socket != null)
                        {
                            try 
                            {
                                socket.close();
                                socket=null;
                            }    
                            catch (IOException e) 
                            {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }

                        if (dataOutputStream != null)
                        {
                            try 
                            {
                                dataOutputStream.close();
                            } 
                            catch (IOException e) 
                            {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }
    };

Я попробовал setSoTimeout, но он бесполезен, потому что он предназначен только для чтения, и setReuseAddress, но он не работает, logcat и консоль не выдают никаких ошибок при запуске приложения. Вы можете помочь мне найти проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...