Android получить строку с Java-сервера после успешного подключения и отправки сообщения - PullRequest
0 голосов
/ 15 февраля 2012

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

   public static void connect(String name, int port)
        throws UnknownHostException, IOException
{

    s = new Socket(name, port);
    out = new PrintWriter(s.getOutputStream(), true);
     input = new BufferedReader(new InputStreamReader(s.getInputStream()));
}

/**
 * Sends a string message to the server.
 * 
 * @param msg
 *            The message to be sent.
 * @throws IOException
 */
 public static void send(String msg) throws IOException
{
    if (!s.isClosed() && msg != null)
    {
        out.println(msg);

        out.close();                                
    }


}
 public static String receive() throws IOException
 {
     if (!s.isClosed())
     {
         result1 = input.readLine();

            out.close(); 
            input.close(); 
            s.close();


     }
    return result1;


 }

  //Used for receiving notifications from the LocationManager when the location has changed

private class MyLocationListener implements LocationListener{


    @Override
    public void onLocationChanged(Location loc) {
        String txt = "Latitude:" + loc.getLatitude() + "/nLongitude:" + loc.getLongitude();
        Log.i("GeoLocation", "My current location is:\n " + txt);
        tv.setText("My current location is:\n" + txt);
        String msg=loc.getLongitude() + "\n" + loc.getLatitude() + "\n"
        + loc.getTime();
        tv1 = (TextView) findViewById(R.id.textView2);
        tv2 = (TextView) findViewById(R.id.textView3);  
        tv3 = (TextView) findViewById(R.id.textView4);
        //determines if the location is within a designated area (rectangle)
        double lat0 = 14.609794;
        double long0 = 120.986018;
        double lat1 = 14.608966;
        double long1 = 120.986037;
        double lat2 = 14.609031;
        double long2 = 120.984991;
        double lat3 = 14.609877;
        double long3 = 120.985069;
        double rel1 = (loc.getLongitude()- long0)*(lat1 - lat0)- ((loc.getLatitude()-lat0)*(long1-long0));
        double rel2 = (loc.getLongitude()- long1)*(lat2 - lat1)- ((loc.getLatitude()-lat1)*(long2-long1));
        double rel3 = (loc.getLongitude()- long2)*(lat3 - lat2)- ((loc.getLatitude()-lat2)*(long3-long2));
        double rel4 = (loc.getLongitude()- long3)*(lat0 - lat3)- ((loc.getLatitude()-lat3)*(long0-long3));

        // if yes, it will connect to server and send the location and timestamp

       if (rel1 >= 0 && rel2 >= 0 && rel3 >= 0 && rel4 >= 0 )
        {
           tv1.setText("Location is inside the road network...");
           new connectSend().execute(msg);  



          // new receiveString().execute();
           }


        else
        {
            tv1.setText("Current location is outside the road network");

        }
        }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

    public class connectSend extends AsyncTask<String, String, String>{

        @Override
        protected String doInBackground(String... msg) {
            // TODO Auto-generated method stub
            String result;

            try
            {
            connect("192.168.10.191", 7774);
            send(msg[0]);
            result = "Sending is SUCCESSFUL ";
            receive();
            publishProgress(result1);

            }

            catch (UnknownHostException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
                result = "Sending NOT SUCCESSFUL ";
            } catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
                result = "Sending NOT SUCCESSFUL ";
            }

            return result;
        }
        @Override
        protected void onProgressUpdate(String... result1) 
        {
                super.onProgressUpdate(result1);
                tv3.setText(result1[0]);
        }

        @Override
        protected void onPostExecute(String result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            tv2.setText(result);

}}    

}

}

В случае необходимости ниже приведен простой сервер Java, который получает данные через сокет и отвечает, если прием прошел успешно

class ChatServer {
private static int port = 1234; /* port to listen on */

public static void main (String[] args) throws IOException {

    class ClientConn implements Runnable {
        private Socket client;

        ClientConn(Socket client) {
            this.client = client;
        }

        public void run() {
            BufferedReader in = null;
            PrintWriter out = null;
            try {
                /* obtain an input stream to this client ... */
                in = new BufferedReader(new InputStreamReader(
                            client.getInputStream()));
                /* ... and an output stream to the same client */
                out = new PrintWriter(client.getOutputStream(), true);
            } catch (IOException e) {
                System.err.println(e);
                return;
            }

            String msg;
            try {
                /* loop reading messages from the client, 
                 * output to stdin and send back an "OK" back */
                while ((msg = in.readLine()) != null) {
                    System.out.println("Client says: " + msg);
                    out.println("OK");
                }
            } catch (IOException e) {
                System.err.println(e);
            }
        }
    }

    ServerSocket server = null;
    try {
        server = new ServerSocket(port); /* start listening on the port */
    } catch (IOException e) {
        System.err.println("Could not listen on port: " + port);
        System.err.println(e);
        System.exit(1);
    }

    Socket client = null;
    while(true) {
        try {
            client = server.accept();
        } catch (IOException e) {
            System.err.println("Accept failed.");
            System.err.println(e);
            System.exit(1);
        }
        /* start a new thread to handle this client */
        Thread t = new Thread(new ClientConn(client));
        t.start();
    }
}

}


Я понял это сейчас. У меня было два out.close () ;. Я удалил один из них, и теперь он работал:)

1 Ответ

0 голосов
/ 15 февраля 2012

На данный момент вы реализовали только одно направление сокетной связи.В настоящее время клиент только отправляет данные, а сервер только получает данные.Вам нужно открыть входной поток на клиенте и выходной поток на сервере.После отправки команды на сервер клиент будет выполнять чтение из входного потока, а сервер будет выполнять запись в выходной поток после чтения команды от клиента.Очень похоже на сообщение, которое вы внедрили в настоящее время, но в другом направлении.

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