Client-Server

  • 10 Antworten
  • Letztes Antwortdatum
B

BlupBlup

Ambitioniertes Mitglied
1
Hi,

ich möchte eine Client-Server Kommunikation erstellen.
Zwei Android Smartphones sollen über einen Server miteinander
kommunizieren und dabei Nachrichten austauschen.
Im Prinzip also ein Chat.

Zwei Smartphones habe ich bereits.
Nun möchte ich einen Server auf meinem Rechner installieren.
Ich würde dabei gerne mit JavaServlets arbeiten.

Kennt sich jemand damit aus und kann mir vielleicht sagen,
ob die Android Kommunikation mit einem Server der mit JavaServlets
arbeitet möglich ist oder muss man da andere Technologien verwenden?
Gibt es ein paar Tipps worauf ich dabei achten sollte und eventuell
ein paar Links mit denen ihr gute Erfahrungen gesammelt habt?

Habe bisher noch nie einen Server installiert. Bin gerade dabei mich einzuarbeiten.
Mein erstes kleines Ziel ist es also einen Server zu installieren und
von einem Android Gerät eine kleine Textnachricht "Hello World" an ein
zweites Android Gerät über einen Server (Vorzugesweise mit JavaServlets) zu verschicken.

Für Tipps, Links und Anregungen bin ich dankbar.
Insbesondere für Hinweise für geignete Server die gratis zum Download zu Verfügung stehen und zu empfehlen sind.
 
- Google Cloud Messaging for Android
- Google App Engine

Gruß
 
Danke für die Stichwörter, allerdings glaube ich das ist nicht ganz das was
ich suche. Ich wollte nur mit den Standardmitteln plus eventuell einem
frei verfügbaren Server, eine Kommunikation zwischen mehreren Handys
stattfindent lassen. Dabei möchte ich auch nicht nach "aussen" ins Internet,
sondern nur im Bereich der WLAN Reichweite "innerhalb" meines Netzes nur mit diesen
Geräten miteinander kommunzieren. Mein Server soll dann auch keine Daten oder ähnliches nach "aussen" ins Internet zur Verfügung stellen oder gar von ausser ansprechbar sein.
Dabei hatte ich mir gedacht eventuell mit Sockets zu arbeiten wie das im Buch "Android 2" von Arno Becker beschrieben wird. Allerdings fehlt mir momentan einfach das Wissen wie ich so einen Server installiere, bzw. was für einen. Den eigentlich Programmcode für die Androis Geräte kenn ich bereits und der auf dem Server ausgeführt werden muss. Da im Buch auf dem Server Javacode ausgeführt wird, nehme ich an es werden JavaServlets verwendet.


Alternative: (?)
Ist es möglich eine Client-Server Kommunikation über Bluetooth zu erstellen?

Angenommen ich habe 4 Handys, die in einer Stern Topologie angeordnet sind.
Eins der Handys repräsentiert den Server. Die anderen 3 die Clients.
Nun sollen die Clients untereinander Textnachrichten (und eventuell Bilder)
austauschen können. Die Kommunikation soll dabei immer über das Server Handy
ablaufen. Das heißt Client1 schickt an das Serverhandy eine Nachricht.
Das Serverhandy implementiert irgendeine Geschäftslogik die dann entscheidet an
welchen Client die Nachricht weiteverschickt werden soll. Im Falle eines Chats
soll das Serverhandy dann die Nachricht an zum Beispiel Client3 weiterschicken, falls Client1 dies beabsichtig hat. Es soll sich dann wie ein echter Chat anfühlen, ohne dass der Empfänger jeden Nachrchterhalt extra über ein OK Button o.ä. bestätigen muss. Die Nachricht soll dann in einem Chatüblichen Textanzeige Bereich angezeigt werden.
 
Hi,

das solltest du schon vorher sagen ;)

Also:
Du könntest selbstverständlich jedes Handys als Server+Client nehmen. (Socket). Somit hört jedes Handy (Server) ob was empfangen wurde. Falls der Empfang an das Handy gerichtet ist, wertet er es aus und schickt es wieder an ALLE "Server" (die auch gleichzeitig Client sind).
Mekrst schon. Stromverbrauch 100% :D

Mit Bluetooth kenne ich mich leider nicht aus.

Ein Handy aber als Server zu betreiben würde auch funktionieren. Allerdings mM viel zu umständlich.

Also die Idee jetzt:
Einen "normalen" Server. Dem schickst du die Nachricht. Jeder Client parst sich dann den Text von der Webseite. Je nach dem was für Ihn bestimmt ist, wird dieser Text angezeigt.
Falls du das ganze nicht im "internet" betreiben willst, brauchst du dafür eigentlich nicht mehr als ein XAMPP-Server.

Gruß
 
serverempfehlung: JBOSS

Weiter hilft dann google und Stackoverflow ;-)
 
Hi Danke für die Antworten.
Ich bin in meinem vorhaben jetzt schon ein bisschen weiter.

Ich habe Code für der Server und Code für den Client fertiggeschrieben.
Beides Java Code.
Dabei brauche ich nicht einmal einen Server a la Apache o.ä.

Den Code der meinen Server repräsentiert programmiere ich in Java und exportiere die Java Datei als ausführbare JAR Datei und lege Sie einfach
auf meinem Desktop ab.
Die JAR Datei starte ich danach über die Konsole über
java -jar MyServer.jar.

Wie gesagt die Kommunikation soll einfach nur in meinem WLAN Netz zwischen den Geräten stattfinden. Es ist nicht mein Ziel, dass irgendwer von "aussen" aus dem Internet auf meinen "Server" zugreift.

Den Client Code, also meine App ziehe ich über USB auf mein Smartphone.
Jetzt kommt es allerdings leider zu dem Problem, dass sobald ich den Button in meiner App klicke der die Serverkommunikation starten soll, stürzt meine App ab.

Der Grund liegt in der Anweisung:
Socket s = new Socket("192.168.178.29", 8081);

192.168.178.29 ist mein Rechner
192.168.178.40 ist mein Smartphone


ServerCode: (Auf dem PC als ausführbare JAR Datei)
Code:
public class MyMain 
{
    public static void main(String[] args) throws IOException 
    {
        ServerSocket server = new ServerSocket(8081);
        
        System.out.println("Server wurde gestartet!");
        
        Socket s = server.accept();
        
        BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String message = in.readLine();
        System.out.println("Empfangene Nachricht vom Client: " + message);
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        
        out.write(message.toUpperCase());
        out.newLine();
        out.flush();
        
        out.close();
        in.close();
        server.close();
        
        System.out.println("Server beendet!");
    }
}
ClientCode (Als App auf dem Smartphone)
public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}


@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}


public void onClickSendMessage(View view) throws IOException
{
Socket s = new Socket("192.168.178.29", 8081);

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
out.write("Hello World");

out.newLine();
out.flush();

BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
String message = in.readLine();

out.close();
in.close();

TextView textView2 = (TextView) findViewById(R.id.textView2);
textView2.setText(message);
}
}
Und hier noch die Manifest Datei
Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mynetworkapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
  
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.mynetworkapp.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
Ich hab zunächst versucht zwei Rechner miteinander kommunzieren zu lassen.
Dabei war einer der Client und der zweite der Server.
Da hat die Kommunikation auch zunächst nicht geklappt.
Der Grund dafür lag darin, dass ich bei beiden Rechnern (Windows 7)
unter "Systemsteuerung" -> "Netzwerk- und Freigabecenter" -> "Aktiver Netzwerke anzeigen" als Netzwerkadresse "Öffentliches Netzwerkt" eingestellt hatte. Nachdem ich dies auf "Heimnetzwerk" umgestellt habe klappte die Kommunikation einwandfrei.

Leider klappt die Kommunikation zwischen meinem Smartphone und Rechner nicht.
Der Aufruf der Anweisung
Socket s = new Socket("192.168.178.29", 8081);
führt zum Absturz der App.
Ich vermute ich muss in meinem Smartphone vielleicht auch irgendwie sowas einstellen, wie bei der Geschichte mit den zwei Rechnern und dem "Heimnetzwerk"
anstelle "Öffentliches Netwerk". Nur weiß ich halt nicht was genau.
Habe übrigens ein Sony Xperia U mit Andorid 4.0

Ich habe mal versucht mein Smartphone anzupingen.

Die Konsole gibt dann aus:
Ping wird ausgeführt für 192.168.178.40 mit 32 Bytes Daten:
Antwort von 192.168.178.29: Zielhost nicht erreichbar
Antwort von 192.168.178.29: Zielhost nicht erreichbar
Antwort von 192.168.178.29: Zielhost nicht erreichbar
Antwort von 192.168.178.29: Zielhost nicht erreichbar

Ping Statistik für 192.168.178.40:
Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0

Ich denke mal der Programmcode ist wohl richtig, aber irgendwas muss in den Einstellungen des Smartphones vermutlich verändert werden. Da ich noch nicht soviel Erfahrung in der App Entwicklung habe, hoffe ich ihr habt vielleicht einen Hinweis.
 
Zuletzt bearbeitet:
Das Anpingen meines Smartphones funktioniert mittlerweile.
Aber dennoch stürzt die App weiterhin ab bei Aufruf von
Socket s = new Socket("192.168.178.29", 8081);
 
Logcat?
Bzw. Welche exception? Network on Main Thread?

Gesendet von meinem GT-S5660 mit der Android-Hilfe.de App
 
Ich habe mein Programm nun mit zwei Smartphones ausprobiert.
Smartphone 1: Sony Xeperia U mit Android 4.0.4
Smartphone 2: LG-P990 mit Android 2.2.2

Mit dem LG-P990 funktioniert alles wunderbar.
Die Kommunikation mit dem Rechner klappt. Die App funktioniert sauber.

Beim Sony Xperia U funktioniert die Kommunikation allerdings nicht.

Es wird eine android.os.NetworkOnMainThreadException geworden.
Der Stacktrace sieht wie folgt aus:

04-29 14:19:54.681: W/System.err(28842): android.os.NetworkOnMainThreadException
04-29 14:19:54.691: W/System.err(28842): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1108)
04-29 14:19:54.691: W/System.err(28842): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
04-29 14:19:54.691: W/System.err(28842): at libcore.io.IoBridge.connectErrno(IoBridge.java:133)
04-29 14:19:54.691: W/System.err(28842): at libcore.io.IoBridge.connect(IoBridge.java:118)
04-29 14:19:54.691: W/System.err(28842): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
04-29 14:19:54.691: W/System.err(28842): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
04-29 14:19:54.691: W/System.err(28842): at java.net.Socket.startupSocket(Socket.java:573)
04-29 14:19:54.691: W/System.err(28842): at java.net.Socket.tryAllAddresses(Socket.java:134)
04-29 14:19:54.691: W/System.err(28842): at java.net.Socket.<init>(Socket.java:184)
04-29 14:19:54.691: W/System.err(28842): at java.net.Socket.<init>(Socket.java:156)
04-29 14:19:54.691: W/System.err(28842): at com.example.mynetworkapp.MainActivity.onClickButton1doSth(MainActivity.java:53)
04-29 14:19:54.691: W/System.err(28842): at java.lang.reflect.Method.invokeNative(Native Method)
04-29 14:19:54.691: W/System.err(28842): at java.lang.reflect.Method.invoke(Method.java:511)
04-29 14:19:54.691: W/System.err(28842): at android.view.View$1.onClick(View.java:3098)
04-29 14:19:54.701: W/System.err(28842): at android.view.View.performClick(View.java:3574)
04-29 14:19:54.701: W/System.err(28842): at android.view.View$PerformClick.run(View.java:14293)
04-29 14:19:54.701: W/System.err(28842): at android.os.Handler.handleCallback(Handler.java:605)
04-29 14:19:54.701: W/System.err(28842): at android.os.Handler.dispatchMessage(Handler.java:92)
04-29 14:19:54.701: W/System.err(28842): at android.os.Looper.loop(Looper.java:137)
04-29 14:19:54.701: W/System.err(28842): at android.app.ActivityThread.main(ActivityThread.java:4448)
04-29 14:19:54.701: W/System.err(28842): at java.lang.reflect.Method.invokeNative(Native Method)
04-29 14:19:54.701: W/System.err(28842): at java.lang.reflect.Method.invoke(Method.java:511)
04-29 14:19:54.701: W/System.err(28842): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
04-29 14:19:54.701: W/System.err(28842): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
04-29 14:19:54.701: W/System.err(28842): at dalvik.system.NativeStart.main(Native Method)
 
Es sind keine Netzwerkverbindungen im Main Thread mehr erlaubt. Der Fehler kommt dann bei neueren Android-Versionen
 
danke google, für diese exception.
 
Zurück
Oben Unten