Datenübertragung zwischen Server PC und Client Android

D

DMD-OL

Neues Mitglied
0
hi
ist es möglich zwei Datenbankinhalte getrennt, aber mit einem Socket an den PC zu schicken und zu empfangen?
Client Android:
Code:
@Override
protected Void doInBackground(Void... arg0) {

    Cursor res = My_Database.getAllData();
    if (res.getCount() == 0){

        Intent click_datenbank = new Intent(daten_transfer.this,pop_datenbank.class);
        startActivity(click_datenbank);

    }else {

        Socket socket = null;

        try {

            SocketAddress sock_addresse = new InetSocketAddress(dstAddress, dstPort);
            socket = new Socket();
            int timeoutMs = 1000;
            socket.connect(sock_addresse, timeoutMs);

            SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
            String dateTime = sdf.format(new Date());

            ByteArrayOutputStream bAPS = new ByteArrayOutputStream(1024);
            byte[] server_Name = new byte[1024];
            int server_Information;

            InputStream input_Message = socket.getInputStream();

            OutputStream out_Username = socket.getOutputStream();
            OutputStream out_1 = socket.getOutputStream();
            OutputStream out_2 = socket.getOutputStream();

            while ((server_Information = input_Message.read(server_Name)) != -1) {

                bAPS.write(server_Name, 0, server_Information);
                response += bAPS.toString("UTF-8");

                PrintStream print_userName = new PrintStream(out_Username);
                print_userName.print(userName);

                String Arbeitsliste = "hier mehrere Listen in einer Liste";
                PrintStream data_1 = new PrintStream(out_1);
                data_1.print(Arbeitsliste);

                String Materialliste = "hier mehrere Listen in einer Liste";
                PrintStream data_2 = new PrintStream(out_2);
                data_2.print(Materialliste);

            }

        } catch (UnknownHostException e) {
            e.printStackTrace();
            failMessage = "IP-ADRESSE UNBEKANNT!";

        } catch (IOException e) {
            e.printStackTrace();
            failMessage = "BAREBONE NICHT ERREICHBAR!";
        }finally{
            if(socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    failMessage = "IO-Exception: " + e.toString();
                }
            }
        }
    }

    return null;
}

Server PC:
Code:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket
import sys
import datetime

streamSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

get_IP = [ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1]

port = 9999
server_address = ((ip,port))

for ip_adresse in get_IP:

    try:
        streamSock.bind(server_address)
        print '\nServer gestartet...\nIP-Adresse: %s\n' % (ip)

    except streamSock as s_err:
        if s_err == errno.ECONNREFUSED or s_err == errno.ECONNRESET:
            print('Kein Internethost verfuegbar!\nServer kann nicht gestartet werden!')

streamSock.listen(25)
kontakt = 0

while True:
    client,addr = streamSock.accept()

    now = datetime.datetime.now()
    currentTime = now.strftime("%d.%m.%Y, %H:%M:%S")

    serverNameDatum = "Stream "+str(kontakt)+(":\n---> DMD-Server ("+currentTime+")\n")
    client.send(serverNameDatum)

    userName = client.recv(1024)
    print ("-------")
    print ("Stream "+str(kontakt)+(": ---> "+str(userName)+" ("+currentTime+")"))

    data_1 = client.recv(2024)
    print data_1

    data_2 = client.recv(3024)
    print data_2

    client.close()
    kontakt += 1

streamSock.close()

In meinem Code kommen beide nur als String an (vorerst auch ok, sollten aber eigentlich richtige Listen sein) .
Und die gesendeten data_1 und data_2 kommen zusammen beim server auf data_1 an!?!?
Ich schätze ich bin massiv zu blöd, daher muß ich um Hilfe bitten.
 
Hallo DMD,

massiv blöd ist keiner , ich stehe auch recht oft auf dem Schlauch. :)
Vorweg , ich bin des Python nicht mächtig - eher C/C++ socket bewandert.

Um deine Frage korrekt beantworten zu können , müsste man erst mal wissen , wie du denn aus Phyton die "Liste" schickst.
Sind das reine ASCII Strings mit CRLF am ende ???
(Ich meine, dies aus deinen Phyton her gesehen zu haben -> "\n").

Wenn das so sein sollte , dann wärst du besser mit einem readln/writeln im Android Socket bedient.

@override
protected Void doInBackground(Void... arg0)
{
Socket socket = null;
try {
socket = new Socket(dstAddress, dstPort);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);
byte[] buffer = new byte[1024];

int bytesRead;
InputStream inputStream = socket.getInputStream();

boolean connected = socket.isConnected() && !socket.isClosed();

while ((bytesRead = inputStream.read(buffer)) != -1)
{
byteArrayOutputStream.write(buffer, 0, bytesRead);
response += byteArrayOutputStream.toString("UTF-8");
}

} catch (UnknownHostException e)
{

e.printStackTrace();
response = "UnknownHostException: " + e.toString();
} catch (IOException e)
{

e.printStackTrace();
response = "IOException: " + e.toString();
}
finally
{
if(socket != null)
{
try
{
socket.close();
} catch (IOException e)
{

e.printStackTrace();
}
}
}
return null;
}

Und auf Phyton seite das "\n" in ein "\r\n" verwandeln. (Also reines CRLF)
 
Zuletzt bearbeitet:
hallo stefan,
danke für deine teilhabe :)
der code, den ich hier verschickt habe, ist etwas kurzer, als der den ich hier habe.
mein entgültiges ziel ist es, den servernamen und datum mit zeit (serverNameDatum) zu schicken.
auf meinem handy habe ich zwei datenbanken. die will ich auslesen und jeweils eine liste der einen und anderen datenbank
getrennt voneinander an meinen pc schicken, d.h. erst servername und dann die beiden listen zurück an den pc.
hab leider noch zu wenig ahnung um etwas zu CRLF zu sagen.
ich glaube, ich müsste dann mit
Code:
    public class MyClientTask extends AsyncTask<List, Void, String> {

        String dstAddress;
        int dstPort;
        String response = "";
        String failMessage = "";
        String userName = "Hans Hase";

        MyClientTask(String addr) {
            dstAddress = addr;
            dstPort = 9999;
        }

        @Override
        protected String doInBackground(List... lists) {
            return null;
        }

    }
anfangen.
der python code ist vollständig dargestellt, da habe ich nichts weggelassen.
hab zu wenig ahnung, so daß ich mir bisher nur ein paar string rüberschicken kann :(
 
Hallo DMD,

so ganz habe ich deine Ausführungen noch nicht verstanden :

Ich fasse mal zusammen :

Du hast auf deinem Handy zwei DB's , diese liest du aus und möchtest den Inhalt als Liste an den PC schicken , der dann den PhytonServer drauf hat - richtig ?

Wenn ja :
Vom Handy aus nicht beides auf einmal schicken , sondern Socket auf, PC Verbinden , schicken , Handshake und dann wieder zu
Das Gleiche dann mit der zweiten DB.
(Dann kommt auch dein Listen/Accept nicht durcheinander)

Zu CRLF - das ist nichts weiters als CarriageReturn (CR) / Linefeed (LF) - der Abschluss einer Zeile .
 
Zuletzt bearbeitet:
richtig.
ok, verstanden.
aber wie kann ich denn wirklich eine liste, also keine liste als string, sondern eine ECHTE liste verschicken???
und wie mach ich einen handshake?
 
Was ist für dich den eine "echte" Liste ??

Du müsstest mal ein Bespiel hier posten .

Handshake.
z.b. einfache variante : CRC32 berechnen und die Summe wieder zurückschicken , dann bist du dir sicher , dass nichts
falsch angekommen ist.
Auch eine Variante statt Strings : JSon
 
json versuche ich zu verwenden.
mit der python server seite hab ich aber noch probleme.
mal sehn...
ich melde mich :) :) :)
 

Ähnliche Themen

Jansenwilson
Antworten
1
Aufrufe
746
swa00
swa00
H
Antworten
2
Aufrufe
1.302
Hcman
H
M
Antworten
4
Aufrufe
1.166
swa00
swa00
Zurück
Oben Unten