[General Questions and Answers] schäfchen:
Hi,

I´m new here and hope you can help me.

I wrote a service for an android app.

The service should keep on a server communication with an TCP Server.

I have to use this kind of solution!

If I start the app, the service is called. I get an connection with the run()-Method (I checked it with an boolean).

But now I can´t receive and send any messanges between server and android device.

Here is the code, may it helps:

Activity:

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;

import com.example.obdii.OBDService.connectSocket;

public class Werkstatt_Client extends Activity {

//Variablen initalisieren
private ListView mList;
private ArrayList arrayList;
private MyCustomAdapter mAdapter;
private OBDService mTcpClient;
static String ip;
public String message;
TextView nachricht;

//SERVICE
private OBDService hallo;
private ServiceConnection serviceconntection = new ServiceConnection(){
//EDITED PART
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
hallo = ((OBDService.LocalBinder)service).getService();

}

@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
hallo = null;
}

};

private void doBindService() {
bindService(new Intent(Werkstatt_Client.this, OBDService.class), serviceconntection, Context.BIND_AUTO_CREATE);
}

private void doUnbindService() {
hallo.onDestroy();
}

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//Layout ansprechen
setContentView(R.layout.activity_werkstatt__client);

//Variablen initalisieren
arrayList = new ArrayList();
final EditText eingabe = (EditText) findViewById(R.id.TfNachricht);
Button send = (Button)findViewById(R.id.BtnSenden);
//Einfügen des eigenen ListViews mit dem Namen list_item
//(Stellt den Verlauf besser dar)
mList = (ListView)findViewById(R.id.chatlist);
mAdapter = new MyCustomAdapter(this, arrayList);
mList.setAdapter(mAdapter);

/* //Binding the activity to the service to perform client-server operations
//start service on create
startService(new Intent(Werkstatt_Client.this,OBDService.class));
doBindService();*/

//OnClickListener für den Button Senden
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
message = eingabe.getText().toString();
//Nachricht zum Verlauf hinzufügen
arrayList.add("Kunde: " + message);
//Nachricht an Server senden
OBDService oc = new OBDService();
connectSocket ic = oc.new connectSocket();
if(ic.k = false){
System.out.println("ICH KANN NICHT SENDEN");
//}
if (ic.k = true) {
//System.out.println(message);
oc.sendMessage(message);
}
//aktualisiert die ListView bei neuen Nachrichten
mAdapter.notifyDataSetChanged();
eingabe.setText("");
}
}
});

}
/**Diese Methode liest die IP aus dem
* dafür vorgesehenen Textfeld aus und
* übergibt sie der Klasse TCPClient*/
public void ipsetzen (View view){
EditText IP = (EditText)findViewById(R.id.TfIP);
ip = (IP.getText().toString());

Intent ir=new Intent(this, OBDService.class);
ir.putExtra("data", ip);
this.startService(ir);
// Verbindung mit dem Server aufbauen
new connectTask().execute("");
}

/**Diese Methode äffnet einen TCPClient
* (Asynchroner Task)*/
public class connectTask extends AsyncTask<String,String,OBDService> {

@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
//Empfangene Nachrichten vom Server im Verlauf hinzufügen
arrayList.add("Werkstatt: " + values[0]);
//Erkennt, dass die Daten sich geändert haben (Nachricht) und fügt sie in einer neuen Zeile hinzu
mAdapter.notifyDataSetChanged();
//Sting aus dem Verlauf abrufen
String werkstattanfrage = values[0].toString();
//Ausgabe zum Debuggen
System.out.println(werkstattanfrage);
//Relevante Zeichen aus String auslesen
}

@Override
protected OBDService doInBackground(String... arg0) {
// TODO Auto-generated method stub
return null;
}
}

public void quittung(View view){
nachricht=(TextView)findViewById(R.id.TfNachricht);
nachricht.setText("Anweisung ausgefuehrt");
}
}

Here is the service:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class OBDService extends Service {

public static String SERVERIP; //Hier muss die IP stehen
public static final int SERVERPORT = 8888;
PrintWriter out;
BufferedReader in;
Socket socket;
InetAddress serverAddr;
private boolean mRun = false;
private String serverMessage;
private OnMessageReceived mMessageListener = null;
public String message;

private final IBinder mylocalbinder = new LocalBinder();
TCPClient mTcpClient = new TCPClient(null);

@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
Log.e("","Client hat sich verbunden");
return mylocalbinder;
}

@Override
public void onCreate() {
// TODO Auto-generated method stub
Log.e("","OnCreat");
super.onCreate();
}

/**Diese Methode Sendet eingetippte Nachrichten
* Server
*/
public void sendMessage(String message){
if(out == null){
System.out.println(message + " ICH KANN NICHT GESENDET WERDEN");
}
if (out != null && !out.checkError()) {
out.println(message);
System.out.println(message + "ICH BIN DER SERVICE");
//Sicherstellen, dass die gesammte Nachricht erfasst wird
out.flush();
}
}

@Override
public int onStartCommand(Intent intent,int flags, int startId){
super.onStartCommand(intent, flags, startId);
sendMessage(message);
System.out.println("I am in on start");
SERVERIP= (String) intent.getExtras().get("data");
// Toast.makeText(this,"Service created ...", Toast.LENGTH_LONG).show();
Runnable connect = new connectSocket();
new Thread(connect).start();
return START_STICKY;
}

class connectSocket implements Runnable {

boolean k;

/**Diese Methode handhabt die gesendeten
* und empfangenen Nachrichten*/
public void run() {
mRun = true;

try {
//IP-Adresse des Servers übergeben
InetAddress serverAddr = InetAddress.getByName(SERVERIP);
//Sicherheitsausgabe an den Server senden
Log.e("TCP Client", "Kunde: Connecting...");
//Öffnet einen Socket, um eine Verbindung mit dem Server herzustellen
Socket socket = new Socket(serverAddr, SERVERPORT);

try {
//Sendet die Nachricht zum Server
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
//Sicherheitsausgabe an den Server
Log.e("TCP Client", "Kunde: Sent.");
Log.e("TCP Client", "Kunde: Done.");
//Empfange Nachrichen vom Server
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//Der Client achtet auf eingehende Nachrichten vom Server
while (mRun) {
serverMessage = in.readLine();
if (serverMessage != null && mMessageListener != null) {
//Ruft die Methode messageReveives von der MainActivity auf
mMessageListener.messageReceived(serverMessage);
}
serverMessage = null;
}
Log.e("RESPONSE FROM SERVER", "Werkstattserver: Received Message: '" + serverMessage + "'");
} catch (Exception e){
//Sicherheitsausgabe an den Server zum Debuggen
Log.e("TCP", "Werkstattserver: Error");
socket.close();
//Dieser Block wird ausgeführt, wenn ein Error aufgetreten ist
}

} catch (Exception e) {
//Sicherheitsausgabe an den Server zum Debuggen
Log.e("TCP", "Kunde: Error", e);
}
}

}

@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
try {
socket.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
socket = null;
}

@Override
public void onRebind(Intent intent) {
// TODO Auto-generated method stub
super.onRebind(intent);
}

@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
return super.onUnbind(intent);
}

public void test(){
Log.e("", "test");
}

public class LocalBinder extends Binder{
public LocalBinder(){
Log.e("", "Binder erzeugt");
}

public OBDService getService(){
return OBDService.this;
}
}
//Zugriff auf die Main Activity (übergabge der Nachrichten)
public interface OnMessageReceived {
public void messageReceived(String message);
}
}

If I try it only with my TCPClient Class, the connection runs. May I call a method wrong?!