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?
risposta
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:
- 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.
- Se si esegue questa operazione costantemente, anche quando l'app non è attiva, è necessario utilizzare il servizio.
- 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)?
Per me la tua risposta è più di ogni altra cosa. Ho trovato tutto il necessario più di una semplice presa. Grazie mille amico – bharath
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:
- installare l'applicazione
- ottenere il telefono e il PC su una LAN
- trovare IP del telefono con https://android.stackexchange.com/a/130468/126934
- corsa
netcat $PHONE_IP 12345
- tipo alcune linee
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
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;
}
}
}
- 1. Timeout connessione socket Android
- 2. Come simulare la perdita della connessione socket?
- 3. Regole di connessione socket persistente Android
- 4. Programmazione socket Android senza connessione WIFi
- 5. connessione SSL Socket iOS
- 6. Timeout connessione socket Python
- 7. HTTP connessione persistente vs connessione socket TCP
- 8. Linux, socket, connessione non bloccante
- 9. Come controllate la connessione internet in Android?
- 10. Come creare socket in estensione google chrome?
- 11. Connessione socket PHP tramite proxy
- 12. Android Nkzawa SocketIO disconnettere e creare una nuova connessione
- 13. mocking una connessione socket in Python
- 14. Come evitare di creare una nuova connessione socket in socket.io dopo l'aggiornamento della pagina html?
- 15. Come prendere in giro una connessione socket in uscita?
- 16. Connessione socket Web non riuscita dal client Android
- 17. Connessione socket TLS tramite Nodejs
- 18. Eccezione socket Android "socket chiuso"
- 19. La connessione BluetoothSocket per Android restituisce zero
- 20. Come distruggere completamente una connessione socket in C
- 21. Come utilizzare i socket UDP in Android?
- 22. Socket IO rileva quando il client ha perso la connessione
- 23. Come posso rifiutare una connessione socket in C?
- 24. Come posso fare una connessione socket client/client (browser)?
- 25. Come determinare la connessione Internet Android?
- 26. In Android, come si disconnette un socket?
- 27. socket Java (server Android-Java)
- 28. GCM vs. socket in Android
- 29. Socket raw su Android
- 30. PHP connessione socket TCP Limit - server Windows
stai cercando di creare un socket server, ad esempio, una presa a cui si connetteranno gli altri? –
Peter grazie per avermelo chiesto. ma ho risolto lo stesso. grazie mille –
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. –