Socket Handy/PC Verbindung unterscheiden

X

XNight

Gast
Hallo erstmal...ich bin neu hier und freue mich auf die Community :)

Ich bin Schüler der 13.Klasse eines Informationstechnischem Gmynasiums. Im IT Unterrich lernen wir Java und haben jetzt ein größeres projekt gestartet (mehr möchte ich an dieser stelle nicht erzählen ;) )

Ich wurde im bereich der Server programmierung eingeteilt. Hierfür müssen wir quasi 2 Server programmieren:
Einen für Handy verbindungen (Handies die sich über Internet mit dem Server verbinden)
und einen für PC Verbindungen.
er ist quasi so aufgebaut:
---EingehendeVerbindung-----(Hauptserver-------Verbindung wird weitergeleitet(Handyserver)(PCServer)

Nun ist mein Problem, diese Verbindungen zu unterscheiden und dem Richtigen Server zuzuweisen.

Die erste Idee war natürlich (liegt ja nahe), ein Paket nach dem Aufbauen der Verbindung zu schicken, welches dem Server sagt, ob es sich um ein Handy oder einen PC handelt. Mit dieser Lösung bin ich aber absolut nicht zufrieden..."Bad Style", wie mein Lehrer sagen würde.
Dadurch kommt zusätzliche unnötige arbeit auf Programmierer eines anderen bereiches zu...ausserdem ist es sehr Fehleranfällig..Ein Handy könnte zum Bespiel fälschlicher Weise für einen PC gehalten werden und dadruch die falschen Daten bekommen. (Könnte auch Absichtlich geschehen um die Daten zu Mißbrauchen!)


Meine frage ist jetzt also: Gibt es eine andere Möglichkeit die eingehenden Verbindungen zu Unterscheiden? Beispielsweise eine Klasse, die mir das sagt? (Facebook schafft es ja auch ;) "...via Facebook über Handy" oder sowas steht da ja immer)
Danke schonmal für eure Hilfe!
 
G

Gast2

Gast
Facebook kann das aber auch nur wenn man eine Facebook App nutzt.

Solange man immer nur mit einem Browser auf der Facebookseite ist (Vom Handy oder von einem PC) kann das Facebook auch nicht unterscheiden. Zum mindest nicht grundlegend. Was man machen kann ist den Useragent auslesen bei einem Browser. Aber zuverlässig ist das auch nicht, das lässt sich sehr einfach fälschen.

Was für eine Technologie nutzt ihr denn überhaupt für die Verbindung? HTTP? Plain TCP über Sockets?
 

moflolo

Mitglied
Es gab leider Probleme mit der Registrierung...Hier also jetzt mein Richtiger (aktivierter!) Account
PNs jetzt bitte auch an diesen Account ;)

Gruß XNight alias moflolo
 
G

Gast2

Gast
Dann sehe ich da direkt keine Möglichkeit verschiedene Clients zu unterscheiden. Das könnte man dann nur machen in dem verschiedene Clients den Server auf verschiedenen Ports ansprechen, über SSL die Requests durch eine Eigenschaft eines SSL Client Zertifikates auseinander sortieren oder halt direkt per Markerierung in dem Protokol. Sprich die Handys sprechen eine andere Protokol Version als die PC Clients.

Das entspräche dann deinem Vorschlag ein "Erkennungs Byte" zu schicken. Das fände ich gar nicht mal schlecht und an für sich nicht unsauber und wird so in vielen Protokollen umgesetzt. Letztlich ist auch der Useragent oder andere HTTP Header im HTTP Protokol nichts anderes als eine Byte Folge die vor dem eigentlichen Request Body gepackt wird.
 
Zuletzt bearbeitet von einem Moderator:

Michael...

Top Contributor
Bin zwar kein Experte, aber ich wüsste nicht, dass bei einer Verbindung via Sockets/TCP der Server erkennen kann, was hinter dem Client steckt.
Entweder der Client gibt sich aktiv als Handy oder PC zu erkennen oder man stellt unterschiedliche Einstiegspunkte zur Verfügung, d.h. ein Handy verbindet sich über eine andere IP anderen Port mit dem Server als ein PC.
 

noobadix

Bekanntes Mitglied
noobadix traut sich noobish wie er ist kaum "antworten" zu drücken, aber: Wenn ich mit dem Handy "surfe", bekomme ich doch, wenn vorhanden, die kleinere "Handy-Variante" der Website, der Server KANN also irgendwie unterscheiden. Evtl ist das Aufgabe des evtl. Apache?
 

Michael...

Top Contributor
Also ich surfe per HTTP ;-)
und da wird im Header z.B. der bereist von fassy erwähnte UserAgent mit übergeben, somit hat der Server eine ungefähre Ahnung mit was er da zu tun hat.

Das war ja einer der Vorschläge - ähnlich wie bei HTTP - im Protokoll einfach den Clienttyp mit zu geben.
 

Empire Phoenix

Top Contributor
im request wird normalerweise bei website mitgeschickt welcher user-agent das is (bzp opera9.28 oder so) wenn du jetzt die sortierst anch mobilebrowsern und normalen hast du schonmal nen stück.

Man könnte auch nen Javascript stück nehmen das die Bildschirmbreite per ajax an den server schickt, der dann anhand der auflösung entscheided was es ist.

Etwas zuverlässiger wäre wenn de HAndy client garnicht in der lage ist das pc-protokoll zu sprechen.

Aber solange keine authentifizierung stattfinded, kannst du nie sicherstellen das das ganze eindeutig ist.

Sauber wäre eine Datenbank mit den useraccounts, und nur wer eingeloggt ist bekommt alle informationen zu sehen(der rest ein loginfeld und öffentliche informationen die für alles sind). In der datenbank ist hinterlegt ob der user ein handy oder ein Pc ist.
 

moflolo

Mitglied
Danke schonmal für die Vielen antworten!

Das mit den Unterschiedlichen Ports klingt interessant.Wäre es denn möglich einen Socket mit über 2 Ports laufen zu lassen?
Müsste ja dann, wenn ich das Richtig verstanden habe so aussehen:
____________________
|###############|
|##HauptServer#####|
|##Port X, Port Y####|
|___________________|
|#######|####### |
|Mobile###|##PC####|
|Server## |##Server#|
|#Port X #|##Port Y##|
|________|__________|


Das mit der Accountverwaltung ist so eine Sache. Eine Solche Datenbank existiert bereits. Allerdings soll sich jeder Benutzer sowohl mit dem Handy als auch mit dem PC einloggen können
 
G

Gast2

Gast
Danke schonmal für die Vielen antworten!

Das mit den Unterschiedlichen Ports klingt interessant.Wäre es denn möglich einen Socket mit über 2 Ports laufen zu lassen?

Ein Socket - ein Port. Aber du kannst ja zwei Sockets aufmachen - sprich der Server startet einfach einen Socket auf Port 1234 und einen auf Port 1235. ;)

Was spricht denn gegen das kodieren des Useragents im Protokoll? Das soll doch bitte mal dein Lehrer erklären. Das ist so vollkommen üblich, siehe mein Posting über HTTP, http://www.java-forum.org/netzwerkp...y-pc-verbindung-unterscheiden.html#post680141. Zumal dir ansonsten auch getrennte Ports nicht wirklich viel bringen. Wenn beide Clients das gleiche und nicht unterscheidbare Protokoll sprechen und die gleichen Messages schicken - was verhindert dann das Client 1 auf dem Port für Client 2 schreibt?

Das ist ehrlich gesagt meiner Einschätzung nach Käse. Dann lieber das Protokoll ordentlich designen und darin den Client kodieren. Das macht wesentlich mehr Sinn.
 

Atze

Top Contributor
Was spricht denn gegen das kodieren des Useragents im Protokoll? Das soll doch bitte mal dein Lehrer erklären. Das ist so vollkommen üblich, siehe mein Posting über HTTP, http://www.java-forum.org/netzwerkp...y-pc-verbindung-unterscheiden.html#post680141.

lehrer untersagen immer das als lösungsweg, was sie selbst nicht verstehen und somit nicht kontrollieren / bewerten können! :D war früher in der berufsschule jedenfalls immer so! "ne, so machen wir das nicht, haltet euch mal an die vorgaben!" - heißt - "ähm, ne, davon hab ich keine ahnung und wenn ihr mir das zeigt, weiß ich nicht was ich damit anfangen soll, ich hab halt nur 2 wochen java auf nem halbtags-seminar gelernt, da kam sowas nicht vor!" :D
 

moflolo

Mitglied
Ein Socket - ein Port. Aber du kannst ja zwei Sockets aufmachen - sprich der Server startet einfach einen Socket auf Port 1234 und einen auf Port 1235. ;)

Was spricht denn gegen das kodieren des Useragents im Protokoll?

Stimmt. Wenn ich direkt 2 Server auf 2 Ports laufen lasse, dann benötige ich den Hauptserver, der die Verbindungen teilen soll, ja garnicht mehr, sondern ledigleich eine klasse die beide Server startet. Klingt schonmal gut!

Useragents....so tief bin ich leider noch nicht in der Matiere drin, aber so wie ich das verstanden habe, kommen die Useragents über den Browser oder?
Die Mobile-Clienten sollen aber nicht über den Browser zugreifen sondern über ein eigenstädngies Java Programm auf dem Handy.
 

moflolo

Mitglied
lehrer untersagen immer das als lösungsweg, was sie selbst nicht verstehen und somit nicht kontrollieren / bewerten können! :D

Hmm..mag manchmal vielleicht stimmen.. Aber zur verteidigung meines Lehrers muss ich sagen, dass er uns keinerlei Lösungswege verbietet! ;)
Wenn irgendwas nicht so schön gelöst ist, bringt er nur seinen standtartspruch "Bad Style"...
aber Grundsätzlich sind uns alle Türen offen.
 
G

Gast2

Gast
"Useragent" ist nur ein Konzept. Damit sagt ein Client: "Hallo ich bin ein Client vom Typ X"

Wenn du z.B. anfängst auf den Stream zu schreiben würdest du halt beim Handy machen:
Java:
String protocolHeader = "Client: Handy; Version: 1.0; User: Klaus; Content-Length: 134"
stream.write(protocolHeader.getBytes("UTF-8"));

Und bei einem PC Client halt:
Java:
String protocolHeader = "Client: PC; Version: 1.3; User: Steffi; Content-Length: 1546"
stream.write(protocolHeader.getBytes("UTF-8"));

Der Server ließt dann erst den Header vom Stream und weiß dann a) was für ein Client es ist, b) welche Protokollversion er spricht, c) welcher User und d) wieviele bytes er jetzt noch vom Stream lesen muss um die volle Message vom Client zu bekommen.

Das ist auf jeden Fall eine saubere Lösung und mit Sicherheit kein "Bad Style"... Sonst stellt dein Lehrer so ziemlich alle modernen Standard Protokolle in Frage. Aber vielleicht weiß er etwas was W3C, IEEE, ANSI, IEC und wie sie alle heißen nicht wissen ;)
 
Zuletzt bearbeitet von einem Moderator:

moflolo

Mitglied
Danke fassy! das sieht echt gut aus.
könntest du mir vielleicht noch ein kurzes beispiel geben, wie das ganze dann auf der Serverseite aussieht?
(Nur das auslesen...das auseinandernehmen bekomm ich schon selber hin ;) )
 
G

Gast2

Gast
Grade greifbar hab ich nur ein Beispiel in CSharp das genau so ewtas fuer IPWebcams macht, aber das Prinzip ist das selbe und der Code zu 90% Java kompatibel:

Der MJPEG Strem schickte so sein Daten:

Code:
--video boundary--Content-length: 34504
Date: 2010-09-22 06:55:25 IO_00000000_PT_000_114
Content-type: image/jpeg

<BINARY JPEG DATA>

--video boundary--
Content-length: 34578
Date: 2010-09-22 06:55:26 IO_00000000_PT_000_114
Content-type: image/jpeg

<BINARY JPEG DATA>

--video boundary--
Content-length: 34578
Date: 2010-09-22 06:55:27 IO_00000000_PT_000_114
Content-type: image/jpeg

usw...

So wird der Header gelesen:
Code:
        private string[] GetJPEGHeaders()
        {
            bool headerDone = false;
            StringBuilder sb = new StringBuilder();
            while (!headerDone)
            {
                sb.Append((char)mjpegStream.ReadByte());
                if (sb.ToString().EndsWith("jpeg"))
                {
                    // cut off the next two CRLFs
                    byte[] crlf = new byte[4];
                    mjpegStream.Read(crlf, 0, 4);
                    headerDone = true;
                }
            }

            return sb.ToString().Split(new String[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
        }
So wird der Contentteil gelesen:
Code:
        public byte[] GetNextBitmapByteArray()
        {
            int read, total = 0;
            int maxRead = 1024;
            int contentLength = GetJPEGContentLength();
            byte[] buffer = new byte[contentLength];

            while ((read = mjpegStream.Read(buffer, total, maxRead)) != 0)
            {
                total += read;

                if (total == contentLength)
                {
                    break;
                }

                if ((total + maxRead) > contentLength)
                {
                    maxRead = contentLength - total;
                }
            }

            return buffer;
        }

Aus dem Protokol der Cam wusste ich halt das der letzte Headerstring mit "jpeg" aufhoert. Du kannst es dir einfach machen und nach dem Header z.B. ein eindeutiges "ENDOFHEADER" Tag schreiben oder so das dann sagt das der Header komplett gelesen wurde.
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Verbindung zwischen Server und handy Netzwerkprogrammierung 1
J Pc - Handy Verbindung? Netzwerkprogrammierung 3
G Verbindung zwischen PC und Handy Netzwerkprogrammierung 10
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
0din Handy schnittsteller ermitteln Netzwerkprogrammierung 8
A serversocket soll anfrage vom handy entgegennehmen Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
D Verbindung zu Geräten mit gleicher IP aber in unterschiedlichen VLans aufbauen Netzwerkprogrammierung 2
M Socket Socket lehnt Verbindung ab Netzwerkprogrammierung 3
IAmFloppy Socket Nachstellen der Verbindung Netzwerkprogrammierung 6
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
M Socket peer to peer Verbindung zwischen Java und Matlab Netzwerkprogrammierung 0
S Bluetooth Verbindung zwischen Android app und Raspberry Pi 3 Netzwerkprogrammierung 1
S Peer2Peer Verbindung trotz NAT Netzwerkprogrammierung 2
T VPN-Verbindung über Java Netzwerkprogrammierung 4
Aruetiise Socket Verbindung Überprüfen Netzwerkprogrammierung 18
F Socket Verbindung mit Verschlüsselung und Authentifierzung Netzwerkprogrammierung 1
F Probleme mit Connection Reset bei Telnet Verbindung Netzwerkprogrammierung 1
U Client Soap Verbindung wieder schließen Netzwerkprogrammierung 0
M Verbindung zwischen zwei Pc in dem Selben Netzwerk Netzwerkprogrammierung 8
P Socket Socket-Verbindung Input sehr langsam Netzwerkprogrammierung 1
S FTP Verbindung zu einem BS2000 Großrechner mit Commons Net Netzwerkprogrammierung 0
F Einfache Socket Verbindung Netzwerkprogrammierung 2
M TCP Verbindung Byte-weise lesen? Netzwerkprogrammierung 5
Shams Problem mit Eventbus in Verbindung mit Server Netzwerkprogrammierung 0
Z Verbindung zwischen 2 Rechnern über ServerSockets nicht möglich Netzwerkprogrammierung 3
F TCP Client, verbindung aufrecht halten Netzwerkprogrammierung 0
I Swing hängt sich auf bei Verbindung zum Server Netzwerkprogrammierung 3
P RMI Hohe CPU Last RMI Verbindung Netzwerkprogrammierung 4
M Socket 2x Proxy multithread-server mit Cross Verbindung Netzwerkprogrammierung 0
T Verbindung zum Server fehlgeschlagen Netzwerkprogrammierung 7
D Einfache Verbindung zu Linux Server und Datei auslesen Netzwerkprogrammierung 13
B Nach Verbindung gleich ObjectStream empfangen Netzwerkprogrammierung 1
R Dauerhaft offene Socket-Verbindung? Netzwerkprogrammierung 3
P server - client verbindung (anfänger) Netzwerkprogrammierung 8
G Socket Socket verbindung für Chat System Netzwerkprogrammierung 3
S Socket Socket Verbindung wiederherstellen Netzwerkprogrammierung 16
T Socket Bidirektionale Verbindung mit Sockets Netzwerkprogrammierung 8
N (TCP) Verbindung ohne Portforwarding Netzwerkprogrammierung 12
N Lan-Verbindung erstellen Netzwerkprogrammierung 2
H Socket Java Chat - Verbindung zum Server fehlgeschlagen. Netzwerkprogrammierung 5
A TCP über UDP Verbindung? Netzwerkprogrammierung 10
D TCP Verbindung (Java Client und Visual Basic Server) Netzwerkprogrammierung 12
E Verbindung zu SQL-Datenbank auf einem Server Netzwerkprogrammierung 13
S Socket Applet Client bekommt keine GLOBALE Verbindung zum Server Netzwerkprogrammierung 25
D Server Client Verbindung - Unexpected End of File - Invalid HTTP Response Netzwerkprogrammierung 4
V NullPointerException bei Verbindung zu RabbitMQ-Server Netzwerkprogrammierung 4
B FTP commons net verschlüsselte verbindung Netzwerkprogrammierung 11
C Verbindung zu einem Hostrechner über das Internet herstellen Netzwerkprogrammierung 15
T Socket Client versucht zyklische Verbindung zum Server Netzwerkprogrammierung 4
X Über eine Socket-Verbindung Arrays übergeben Netzwerkprogrammierung 5
P Socket Verbindung über das Internet Netzwerkprogrammierung 2
A Socket Socket Verbindung unterbrochen --> keine Exception Netzwerkprogrammierung 7
S SVNKit - Verbindung zum Repository trennen? Netzwerkprogrammierung 2
P Socket neuer Client - neue(r) Socket/Verbindung geöffnet? Netzwerkprogrammierung 6
M Problem mit Socket-Verbindung Netzwerkprogrammierung 2
X SSH Verbindung zu Remote Datenbank Netzwerkprogrammierung 2
S TCP Verbindung zu Beamer Netzwerkprogrammierung 8
Y server client socket verbindung übers internet aufbauen Netzwerkprogrammierung 8
M ganymed-ssh2.har: ftp-Verbindung über ftp-Proxy Netzwerkprogrammierung 2
D Verbindung zw. zwei Rechnern funzt nicht Netzwerkprogrammierung 5
F Socket Socket Verbindung Netzwerkprogrammierung 10
E Server schließt einfach verbindung? Netzwerkprogrammierung 6
Shoox VPN-Verbindung für Datenbankzugriff Netzwerkprogrammierung 2
O Telnet verbindung Netzwerkprogrammierung 4
Dit_ UDP Verbindung durch Proxy Netzwerkprogrammierung 4
H Socket Client server,verbindung läst sich nicht abbauen&code optimierung Netzwerkprogrammierung 3
V Verbindung zweier Rechner über das Internet mit Sockets Netzwerkprogrammierung 8
M HTTP HTTPS-Verbindung mittels Java und Javascript Netzwerkprogrammierung 2
N Verbindung zu Fritzbox Socket/Telnet ??? Netzwerkprogrammierung 5
multiholle RMI Verbindung Linux <-> Windows Netzwerkprogrammierung 4
S netzwerkprotokoll auf basis einer tcp verbindung erstellen Netzwerkprogrammierung 9
S SSH Verbindung mit j2ssh Netzwerkprogrammierung 3
H Socket Mit Applet Verbindung zu eigener Website aufbauen Netzwerkprogrammierung 4
H Socket Socket verbindung mit einem TeamSpeak2 Server Netzwerkprogrammierung 5
H TCP verbindung hinter NAT Netzwerkprogrammierung 28
G TCP SSL Verbindung Netzwerkprogrammierung 3
P Java / My-Sql Verbindung herstellen Netzwerkprogrammierung 6
W Socket Shellscript über ssh Verbindung aufrufen Netzwerkprogrammierung 14
N Socket Verbindung wird immer verweigert Netzwerkprogrammierung 5
Dit_ UDP-Verbindung, DatagramPakete Netzwerkprogrammierung 3
S Socket verbindung trennen Netzwerkprogrammierung 3
D Verbindung zu einem Server - POST Netzwerkprogrammierung 2
musiKk SSL-Verbindung mit Client-Zertifikat (Private Key) scheitert Netzwerkprogrammierung 13
D Socketprogrammierung Verbindung C++=>Java Netzwerkprogrammierung 23
B Probleme mit FTP verbindung Netzwerkprogrammierung 22
T Mac Adresse über Socket Verbindung abfragen? Netzwerkprogrammierung 9
L SSL Verbindung aber Server wird erst im Programm festgelegt Netzwerkprogrammierung 4
L Https Verbindung wird aus jar heraus nicht aufgebaut Netzwerkprogrammierung 12
M Verbindung über Proxy// Problem mit Outputstream bei URLConn Netzwerkprogrammierung 5
O TCP Socket-Verbindung überprüfen Netzwerkprogrammierung 4
F Peer to Peer Verbindung zwischen mehreren Clients? Netzwerkprogrammierung 8
F applet verbindung zum server Netzwerkprogrammierung 6
T Verbindung über das Internet Netzwerkprogrammierung 2
B Bibliothek, um Eckdaten zur Internet-Verbindung rauszufinden Netzwerkprogrammierung 2
C Verbindung zwischen 2 Computern herstellen Netzwerkprogrammierung 12
G USB-Verbindung herstellen Netzwerkprogrammierung 3
O SSH-Verbindung (trilead-ssh2-build212) Netzwerkprogrammierung 2
K Verbindung mit Unix Server aufnehmen Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben