it-swarm.com.de

Android TCP Server-Client-Kommunikation

Ich habe ein gut geschriebenes Tutorial here für Server-Client-Kommunikation auf Android gefunden. Klappt wunderbar. Es ist jedoch nur eine Möglichkeit der Kommunikation. Ich versuche, die Serverantwort im Client zu hören, aber ich weiß nicht, wo ich mich irre. Hier ist der Code für den Server, auf dem ich Änderungen vornehmen möchte.

Server

public class Server extends Activity {

    private ServerSocket serverSocket;

    Handler updateConversationHandler;

    Thread serverThread = null;

    private TextView text;



    public static final int SERVERPORT = 8080;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        text = (TextView) findViewById(R.id.text2);

        updateConversationHandler = new Handler();

        this.serverThread = new Thread(new ServerThread());
        this.serverThread.start();

    }

    @Override
    protected void onStop() {
        super.onStop();
        try {
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    class ServerThread implements Runnable {

        public void run() {
            Socket socket = null;
            try {
                serverSocket = new ServerSocket(SERVERPORT);
            } catch (IOException e) {
                e.printStackTrace();
            }
            while (!Thread.currentThread().isInterrupted()) {

                try {

                    socket = serverSocket.accept();

                    CommunicationThread commThread = new CommunicationThread(socket);
                    new Thread(commThread).start();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    class CommunicationThread implements Runnable {

        private Socket clientSocket;

        private BufferedReader input;

        public CommunicationThread(Socket clientSocket) {

            this.clientSocket = clientSocket;

            try {

                this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void run() {


            while (!Thread.currentThread().isInterrupted()) {

                try {

                    String read = input.readLine();

                     if (read == null ){
                         Thread.currentThread().interrupt();
                     }else{
                         BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
                         out.write("TstMsg");
                         updateConversationHandler.post(new updateUIThread(read));

                     }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    class updateUIThread implements Runnable {
        private String msg;

        public updateUIThread(String str) {
            this.msg = str;
        }

        @Override
        public void run() {
            text.setText("Client Says: "+ msg + new Date() + "\n");

        }

    }

}

Client

public class Client extends Activity {

    private Socket socket;

    private static final int SERVERPORT = 8080;
    private static final String SERVER_IP = "192.168.104.107";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);      
                    new Thread(new ClientThread()).start();

    }


    public void onClick(View view) {
        try {
            EditText et = (EditText) findViewById(R.id.EditText01);
            String str = et.getText().toString();
            PrintWriter out = new PrintWriter(new BufferedWriter(
                    new OutputStreamWriter(socket.getOutputStream())),
                    true);
            out.println(str);
            out.flush();
            BufferedReader  in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String read = in.readLine();
            System.out.println("MSG:" + read);  

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    class ClientThread implements Runnable {

        @Override
        public void run() {

            try {
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
                socket = new Socket(serverAddr, SERVERPORT);

            } catch (UnknownHostException e1) {
                e1.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();
            }

        }

    }
}

Update

Wenn der Client eine Nachricht an den Server sendet, wird die Nachricht vom Server empfangen, der Server sendet jedoch seine Antwort 

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
 out.write("TstMsg");

und im Client

String read = in.readLine();
System.out.println("MSG:" + read); 

Es wird nicht vom Client empfangen, oder wir können sagen, dass der Server die Client-Nachricht abhört, der Client jedoch nicht. Ich habe beide Berechtigungen im Manifest hinzugefügt.

<uses-permission Android:name="Android.permission.INTERNET" >
</uses-permission>

<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>

Update Nach einem langen Hang kommen diese Fehler.

11-28 18:35:45.786: E/GTalkService(292): connectionClosed: no XMPPConnection - That's strange!
11-28 18:35:48.806: D/ConnectivityService(148): handleInetConditionHoldEnd: net=1, condition=0, published condition=0
11-28 18:35:54.526: I/GTalkService/c(292): [[email protected]] connect: acct=1000000, state=CONNECTING
11-28 18:35:55.176: D/dalvikvm(1167): GC_CONCURRENT freed 495K, 9% free 6604K/7239K, paused 2ms+3ms
11-28 18:35:55.226: D/Finsky(1167): [1] 5.onFinished: Installation state replication succeeded.
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): Problem with socket or streams.
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): Java.net.ConnectException: failed to connect to www.google-analytics.com/173.194.39.41 (port 80): connect failed: ETIMEDOUT (Connection timed out)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at libcore.io.IoBridge.connect(IoBridge.Java:114)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:192)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:459)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at Java.net.Socket.connect(Socket.Java:842)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at org.Apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.Java:119)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at com.google.Android.apps.analytics.t.run(Unknown Source)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at Android.os.Handler.handleCallback(Handler.Java:605)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at Android.os.Handler.dispatchMessage(Handler.Java:92)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at Android.os.Looper.loop(Looper.Java:137)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at Android.os.HandlerThread.run(HandlerThread.Java:60)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): Caused by: libcore.io.ErrnoException: connect failed: ETIMEDOUT (Connection timed out)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at libcore.io.Posix.connect(Native Method)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at libcore.io.BlockGuardOs.connect(BlockGuardOs.Java:85)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at libcore.io.IoBridge.connectErrno(IoBridge.Java:127)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  at libcore.io.IoBridge.connect(IoBridge.Java:112)
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349):  ... 9 more
11-28 18:37:29.016: D/dalvikvm(349): GC_CONCURRENT freed 1258K, 35% free 8238K/12487K, paused 2ms+8ms
8
user934820

Ich bin mir immer noch nicht sicher, was Sie erreichen wollen. Ihr Fehler -log zeigt einen XMPPConnection-Fehler an. XMPP wird nicht über den von Ihnen verwendeten Port im bereitgestellten Code gehandhabt. Daher kann diese Fehlermeldung aus einem anderen Teil Ihrer Anwendung stammen. Die andere Fehlermeldung bezieht sich auf eine HTTP-Verbindung für Google Analytics Keines davon ist mit dem von Ihnen geposteten Code-Snippet verbunden. Sie sollten Ihr Problem beheben, indem Sie mögliche Ausnahmen erfassen, Log.d mit einem Tag, mit dem Sie Ihre Fehlermeldungen filtern können. Der Hinweis von Martin James ist gut, denke ich, also ist es eine gute Idee, wenn Sie versuchen, zu einem byteweisen Lesen Ihres Inputstreams zu wechseln, um Verifizierung und Downtracing durchzuführen, wenn Sie Daten von Ihrem Server erhalten.

1
Peter

readLine () erwartet eine tatsächliche Zeile: 'Es wird davon ausgegangen, dass eine Zeile durch einen Zeilenvorschub ('\n '), einen Wagenrücklauf ('\r ') oder einen Wagenrücklauf beendet wird, dem unmittelbar ein Zeilenvorschub folgt. '

Sie sollten also eins schicken, z. mit BufferedWriter.newLine ().

1
Martin James

Haben Sie beim Schreiben versucht, eine neue Zeile ("\n") hinzuzufügen? Versuchen Sie stattdessen out.write("TstMsg"+ "\n")

0
Les

Haben Sie den folgenden Code in Ihren Code geschrieben?

out.flush();

nach dem 

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
out.write("TstMsg");
0
kumar