Netzwerk-Überblick

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

hi
ich programmiere freizeitlich eine kleine material-zeit-erfassung, um mir das leben leichter zu machen.
dazu nutze ich zur zeit eine voll funktionierende wlan verbindung.
Serverseite ist in Python (PC), Clientseite ist Android-Studio (Handy).
Alles läuft zwar, aber ich muß mich mit meinem Handy ins ansässige WLAN-Umfeld aufhalten, um dann
übertragen zu können. Blöd!
Ich versuche daher, eine Netzwerkverbindung zu schaffen, die von überall auf der Welt funktioniert.
Ich hätte gern gewußt, wie man das macht bzw. überhaupt einen Überblick über VPN, TCP, usw :)
Damit ich das umsetzen kann.
Ich habe dazu diese Seite gefunden:
http://ramakavanan.blogspot.com/2017/11 ... ython.html

server:

Code: Alles auswählen

        
        get_IP = [TCP_IP for TCP_IP in socket.gethostbyname_ex(socket.gethostname())[2] if not TCP_IP.startswith("127.")][:1]
        if TCP_IP.startswith("127."):
            self.start_Server.set("Server nicht gestartet...\nKEIN W-LAN VERFÜGBAR!")
            self.start_Client.set("Um den Server starten zu können,\nmuß eine W-LAN-Verbindung vorliegen!")
        else:
            TCP_PORT = 9090
            self.start_Server.set("Server gestartet...\nIP-Adresse: {}".format(TCP_IP))
            server = SocketServer.TCPServer((TCP_IP, TCP_PORT), Datentransfer)
            thread = threading.Thread(target=server.serve
            _forever)
            thread.start()
            
            
            [...]
            
   class Datentransfer(SocketServer.BaseRequestHandler):

    def handle(self):

        global mainwindow
        global failmessage

        speicherort = os.environ['PROGRAMDATA']
        path_grund = speicherort+"\\DMD-Data.soft\\SYSTEM"
        path_adressen = path_grund+'\Adressenliste'
        path_bauvor = path_grund+'\Bauvorhabenliste'
        SQL_Adressdateien = '%s\\Adressenliste.db'  %(path_adressen)
        SQL_Bauvorhaben = '%s\\Bauvorhabenliste.db' %(path_bauvor)

        now = datetime.datetime.now()
        currentTime = now.strftime("%d.%m.%Y, %H:%M:%S")
        self.request.send("Stream:\n---> DMD-Server ("+currentTime+")\n")
        self.data = self.request.recv(65536)
        self.json_data = json.loads(self.data)
        function = self.json_data['Funktion']
        if function == "BESTELLUNG":
        [...]
Client:

Code: Alles auswählen

    private void transfer() {

        String urlText = mContentView.getIPAddress();


        final ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        final NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (networkInfo != null && networkInfo.isConnected()) {
            if (urlText.length() != 0) {

                AccountStorage.saveIPAddress(this, urlText);

                MyClientTask myClientTask = new MyClientTask(urlText);
                myClientTask.execute();

            } else {
                Toast.makeText(this, "SERVER-IP-ADRESSE\n(SIEHE PC) EINGEBEN!", Toast.LENGTH_LONG).show();
            }

        } else {
            Toast.makeText(this, "KEIN W-LAN!", Toast.LENGTH_LONG).show();

        }

    }
    
    [...]
    
                        //Senden
                    json.put("Funktion", "ARBEITSZEIT");
                    json.put("User", userName);
                    json.put("Datetime", dateTime);
                    json.put("Arbeitsliste", arb_List);
                    json.put("Materialliste", mat_List);

                    SocketAddress sock_addresse = new InetSocketAddress(dstAddress, dstPort);
                    socket = new Socket();
                    socket.connect(sock_addresse, timeoutMs);
    
    
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Du brauchst einen Router, der so konfiguriert ist, dass er Anfragen, die an Deine Public-IP ankommen zu deinem Server-Rechner weiterleitet.

Dass man eine Variable, die man innerhalb einer List-Comprehension hat, nicht außerhalb davon benutzen sollte, habe ich Dir glaube ich schon vor ein paar Jahren etliche male gesagt. Geändert hat sich am Code aber immer noch nichts. Irgendwie frustrierend.
Globale Variablen sollte man nicht benutzen, erst recht nicht mit Threads. Pfade setzt man nicht mit String-Formatierung oder + zusammen sondern mit os.path.join.
Auf rohen Sockets sollte man nicht arbeiten, send garantiert nicht, dass alles gesendet wurde, recv nur, dass mindestns ein Byte gelesen wurde.
Bevor man anfängt, ein eigenes Protokoll zu schrieben, benutzt man eins, das es schon gibt, z.B. HTTP.
Antworten