2011-09-12 16 views
21

Ho un'applicazione in cui ho bisogno di creare una connessione socket. Il mio requisito è che, una volta stabilita la connessione socket, è necessario essere vivo finché non lo chiudo personalmente. Ogni 3 minuti devo inviare pacchetti di dati all'altro capo. Qualcuno può fornirmi qualche esempio di codice con mi aiuterà a fare questo?come creare la connessione Socket in Android?

+0

stai cercando di creare un socket server, ad esempio, una presa a cui si connetteranno gli altri? –

+0

Peter grazie per avermelo chiesto. ma ho risolto lo stesso. grazie mille –

+1

Sì, ho visto la risposta che hai accettato. Se si prevede di eseguire un server su dispositivo mobile, consultare il mio commento su tale risposta. –

risposta

36

connessioni socket in Android sono le stesse in Java: http://www.oracle.com/technetwork/java/socket-140484.html

cose che dovete essere a conoscenza di:

  1. Se il telefono va a dormire la vostra applicazione non sarà più eseguito, in modo da presa finirà tempo scaduto. È possibile prevenirlo con il wake lock. Questo mangerà tremendamente i dispositivi della batteria - so che non utilizzerei quell'app.
  2. Se si esegue questa operazione costantemente, anche quando l'app non è attiva, è necessario utilizzare il servizio.
  3. Le attività e i servizi possono essere eliminati dal sistema operativo in qualsiasi momento, specialmente se fanno parte di un'app inattiva.

Dai uno sguardo allo AlarmManager, se hai bisogno dell'esecuzione programmata del tuo codice.

È necessario eseguire il codice e ricevere dati anche se l'utente non utilizza più l'app (ad esempio l'app è inattiva)?

+0

Per me la tua risposta è più di ogni altra cosa. Ho trovato tutto il necessario più di una semplice presa. Grazie mille amico – bharath

4

semplice server socket app esempio

Ho già postato un esempio di client a: https://stackoverflow.com/a/35971718/895245, quindi ecco qui un esempio di server.

Questa applicazione di esempio esegue un server che restituisce un codice ROT-1 dell'ingresso.

Sarà quindi necessario aggiungere un pulsante Exit + alcuni ritardi di sospensione, ma questo dovrebbe iniziare.

a giocare con lui:

Le prese Android sono lo stesso di Java, tranne che dobbiamo affrontare alcuni problemi di autorizzazione.

src/com/cirosantilli/android_cheat/presa

Abbiamo bisogno di un metodo Service o altro fondo o altro: How to fix android.os.NetworkOnMainThreadException?

package com.cirosantilli.android_cheat.socket; 

import android.app.Activity; 
import android.app.IntentService; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Main extends Activity { 
    static final String TAG = "AndroidCheatSocket"; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d(Main.TAG, "onCreate"); 
     Main.this.startService(new Intent(Main.this, MyService.class)); 
    } 

    public static class MyService extends IntentService { 
     public MyService() { 
      super("MyService"); 
     } 
     @Override 
     protected void onHandleIntent(Intent intent) { 
      Log.d(Main.TAG, "onHandleIntent"); 
      final int port = 12345; 
      ServerSocket listener = null; 
      try { 
       listener = new ServerSocket(port); 
       Log.d(Main.TAG, String.format("listening on port = %d", port)); 
       while (true) { 
        Log.d(Main.TAG, "waiting for client"); 
        Socket socket = listener.accept(); 
        Log.d(Main.TAG, String.format("client connected from: %s", socket.getRemoteSocketAddress().toString())); 
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
        PrintStream out = new PrintStream(socket.getOutputStream()); 
        for (String inputLine; (inputLine = in.readLine()) != null;) { 
         Log.d(Main.TAG, "received"); 
         Log.d(Main.TAG, inputLine); 
         StringBuilder outputStringBuilder = new StringBuilder(""); 
         char inputLineChars[] = inputLine.toCharArray(); 
         for (char c : inputLineChars) 
          outputStringBuilder.append(Character.toChars(c + 1)); 
         out.println(outputStringBuilder); 
        } 
       } 
      } catch(IOException e) { 
       Log.d(Main.TAG, e.toString()); 
      } 
     } 
    } 
} 

AndroidManifest.xml

necessario aggiungere: <uses-permission android:name="android.permission.INTERNET" /> oppure: Java socket IOException - permission denied

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.cirosantilli.android_cheat.socket" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="22" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <application android:label="AndroidCheatsocket"> 
     <activity android:name="Main"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <service android:name=".Main$MyService" /> 
    </application> 
</manifest> 

su GitHub con un build.xml: https://github.com/cirosantilli/android-cheat/tree/92de020d0b708549a444ebd9f881de7b240b3fbc/socket

4

Qui, in questo post troverete il codice dettagliato per stabilire presa tra dispositivi o tra due applicazioni nello stesso cellulare.

È necessario creare due applicazioni per testare il codice riportato di seguito.

In file manifesto sia dell'applicazione, aggiungere sotto il permesso

<uses-permission android:name="android.permission.INTERNET" /> 

prima App Codice: client socket

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TableRow 
     android:id="@+id/tr_send_message" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginTop="11dp"> 

     <EditText 
      android:id="@+id/edt_send_message" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:layout_marginRight="10dp" 
      android:layout_marginLeft="10dp" 
      android:hint="Enter message" 
      android:inputType="text" /> 

     <Button 
      android:id="@+id/btn_send" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginRight="10dp" 
      android:text="Send" /> 
    </TableRow> 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_below="@+id/tr_send_message" 
     android:layout_marginTop="25dp" 
     android:id="@+id/scrollView2"> 

     <TextView 
      android:id="@+id/tv_reply_from_server" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" /> 
    </ScrollView> 
</RelativeLayout> 

MainActivity.java

import android.os.Bundle; 
import android.os.Handler; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import java.net.Socket; 

/** 
* Created by Girish Bhalerao on 5/4/2017. 
*/ 
public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

    private TextView mTextViewReplyFromServer; 
    private EditText mEditTextSendMessage; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button buttonSend = (Button) findViewById(R.id.btn_send); 

     mEditTextSendMessage = (EditText) findViewById(R.id.edt_send_message); 
     mTextViewReplyFromServer = (TextView) findViewById(R.id.tv_reply_from_server); 

     buttonSend.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 

     switch (v.getId()) { 

      case R.id.btn_send: 
       sendMessage(mEditTextSendMessage.getText().toString()); 
       break; 
     } 
    } 

    private void sendMessage(final String msg) { 

     final Handler handler = new Handler(); 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 

       try { 
        //Replace below IP with the IP of that device in which server socket open. 
        //If you change port then change the port number in the server side code also. 
        Socket s = new Socket("xxx.xxx.xxx.xxx", 9002); 

        OutputStream out = s.getOutputStream(); 

        PrintWriter output = new PrintWriter(out); 

        output.println(msg); 
        output.flush(); 
        BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
        final String st = input.readLine(); 

        handler.post(new Runnable() { 
         @Override 
         public void run() { 

          String s = mTextViewReplyFromServer.getText().toString(); 
          if (st.trim().length() != 0) 
           mTextViewReplyFromServer.setText(s + "\nFrom Server : " + st); 
         } 
        }); 

        output.close(); 
        out.close(); 
        s.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

     thread.start(); 
    } 
} 

2 ° App Codice - Socket Server

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <Button 
     android:id="@+id/btn_stop_receiving" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="STOP Receiving data" 
     android:layout_alignParentTop="true" 
     android:enabled="false" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="89dp" /> 

    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/btn_stop_receiving" 
     android:layout_marginTop="35dp" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true"> 

     <TextView 
      android:id="@+id/tv_data_from_client" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" /> 
    </ScrollView> 

    <Button 
     android:id="@+id/btn_start_receiving" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="START Receiving data" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="14dp" /> 
</RelativeLayout> 

MainActivity.java

import android.os.Bundle; 
import android.os.Handler; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

/** 
* Created by Girish Bhalerao on 5/4/2017. 
*/ 
public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

    final Handler handler = new Handler(); 

    private Button buttonStartReceiving; 
    private Button buttonStopReceiving; 
    private TextView textViewDataFromClient; 
    private boolean end = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     buttonStartReceiving = (Button) findViewById(R.id.btn_start_receiving); 
     buttonStopReceiving = (Button) findViewById(R.id.btn_stop_receiving); 
     textViewDataFromClient = (TextView) findViewById(R.id.tv_data_from_client); 

     buttonStartReceiving.setOnClickListener(this); 
     buttonStopReceiving.setOnClickListener(this); 

    } 

    private void startServerSocket() { 

     Thread thread = new Thread(new Runnable() { 

      private String stringData = null; 

      @Override 
      public void run() { 

       try { 

        ServerSocket ss = new ServerSocket(9002); 

        while (!end) { 
         //Server is waiting for client here, if needed 
         Socket s = ss.accept(); 
         BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
         PrintWriter output = new PrintWriter(s.getOutputStream()); 

         stringData = input.readLine(); 
         output.println("FROM SERVER - " + stringData.toUpperCase()); 
         output.flush(); 

         try { 
          Thread.sleep(1000); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
         updateUI(stringData); 
         if (stringData.equalsIgnoreCase("STOP")) { 
          end = true; 
          output.close(); 
          s.close(); 
          break; 
         } 

         output.close(); 
         s.close(); 
        } 
        ss.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

     }); 
     thread.start(); 
    } 

    private void updateUI(final String stringData) { 

     handler.post(new Runnable() { 
      @Override 
      public void run() { 

       String s = textViewDataFromClient.getText().toString(); 
       if (stringData.trim().length() != 0) 
        textViewDataFromClient.setText(s + "\n" + "From Client : " + stringData); 
      } 
     }); 
    } 

    @Override 
    public void onClick(View v) { 

     switch (v.getId()) { 
      case R.id.btn_start_receiving: 

       startServerSocket(); 
       buttonStartReceiving.setEnabled(false); 
       buttonStopReceiving.setEnabled(true); 
       break; 

      case R.id.btn_stop_receiving: 

       //stopping server socket logic you can add yourself 
       buttonStartReceiving.setEnabled(true); 
       buttonStopReceiving.setEnabled(false); 
       break; 
     } 
    } 
} 
Problemi correlati