Echo Client & weitere Fragen

S

Spike Spiegel

Neues Mitglied
0
Moinse Leutz und da ich neu bin auch mal nen Gruß ans Forum,
ok nun zum Teil wo es interessant wird. Mein Grundproblem ist das erstellen eines Echo Clients halt auf TCP-Basis. Dazu soll sich der Inhalt meiner Nachricht aus einem Byte Array bestehen, ich werde immer auf Byte Ebene bleiben.

Ich konnte schon eine Verbindung herstellen und mein beschriebenes Byte Array korrekt versenden nun sendet mir mein Server dieses eben empfangene Byte Array wieder zurück.

Zum empfangen hab ich mir nen Listener geschrieben, der halt nur auf seinen Kanal horcht und wenn es was gibt soll er die Nachricht dann in meinen TextView in meinem Hauptfenster, bzw. Hauptklasse schreiben.

Aber sobald er in der while-Schleife auf den TextView zugreifen will kommt die aussagekräftige Info „Sorry! The application PROJECT_NAME has stopped unexpectedly. Please try again.“. Und ich habe neh Zeitlang mit Netbeans programmiert daher bin ich in Eclipse auch noch nicht ganz so bewandert, besonders wenn es um den Debug-Mode geht. Ich kann aber z.B. aus meiner while-Schleife die finish-Methode aufrufen.

Daher ganz klar meine Frage, was mache ich verkehrt. Das ganze hab ich als einen throw away prototyp geprogt, daher entschuldigt die teilweise inkorrekte Syntax etc.

Hauptklasse
Code:
package de.prototyp.connection;


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class SocketPrototyp extends Activity {

    private Socket socket;
    // public String server_ip = "192.168.0.97";
    private String server_ip = "10.0.2.2"; // Client(Android Gateway) -> Host(Rechner)
    // public String server_ip = "10.0.2.15"; // Host(Rechner -> Client(Android Gateway)
    private OutputStream writer_OS;
    private InputStream in_IS;
    private byte[] message = new byte[] { 1, 2 };
    private boolean firstConnect = false;
    private String temp_message;
    // create TextViews 
    private TextView textView_ip_port_field;
    private TextView textView_incoming_field;
    private TextView textView_outgoing_field;
    private TextView textView_debug_info;
    private Listener listener;
    // <-End Variable

    public void set_textView_incoming_field(String msg){
        textView_incoming_field.setText(msg);
    }
    
    private void connect() {
        if (firstConnect == false) {
            try {
                socket = new Socket(server_ip, 9999);
                writer_OS = socket.getOutputStream();
                in_IS = socket.getInputStream();
                firstConnect = true;
            } catch (UnknownHostException e) {
                firstConnect = false;
            } catch (IOException e) {
                firstConnect = false;
            }
        }
        if (firstConnect == true) {
            textView_ip_port_field.setText(server_ip);
            listener = new Listener(in_IS,this);

        }
    }

    private void sendByteMsg(byte[] message) {
        if (firstConnect == true) {
            try {
                writer_OS.write(message);
                temp_message = &quot;&quot;;
                for (int i = 0; i < message.length; i++) {
                    if (i < message.length)
                        temp_message += &quot;&quot; + message[i] + &quot; &quot;;
                    else
                        temp_message += &quot;&quot; + message[i];
                }
                textView_outgoing_field.setText(&quot;Sending: &quot; + temp_message);
            } catch (IOException e) {
            }
        }
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //----- Buttons
        Button button_connect = (Button) findViewById(R.id.button_connect);
        Button button_send = (Button) findViewById(R.id.button_send);
        Button button_finish = (Button) findViewById(R.id.button_finish);
        Button button_undebug = (Button) findViewById(R.id.button_undebug);
        //----- TextViews
        textView_ip_port_field = (TextView) findViewById(R.id.TextView_ip_port_field);
        textView_incoming_field = (TextView) findViewById(R.id.TextView_incoming_field);
        textView_outgoing_field = (TextView) findViewById(R.id.TextView_outgoing_field);
        textView_debug_info = (TextView) findViewById(R.id.TextView_debug_info);
        //----- OnClicks
        button_connect.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                connect();
            }
        });
        button_send.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                sendByteMsg(message);
            }
        });
        button_finish.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
        button_undebug.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                server_ip = &quot;192.168.0.97&quot;;
                textView_debug_info.setText(&quot;Debug-Mode is off, you will connect to X61&quot;);
            }
        });
    }
}
Listener
Code:
package de.prototyp.connection;

import java.io.IOException;
import java.io.InputStream;

public class Listener extends Thread{
    private SocketPrototyp socketPrototyp;
    private InputStream in_IS;
    private byte[] buffer = new byte[10];
    private int bytesRead = 1;
    private String temp_incoming;
    
    public Listener(InputStream in_IS, SocketPrototyp socketPrototyp){    
        this.in_IS = in_IS;
        this.socketPrototyp = socketPrototyp;
        socketPrototyp.set_textView_incoming_field(&quot;test&quot;);
        this.start();
    }
    
    private void write_test(String msg){
        socketPrototyp.set_textView_incoming_field(msg);
    }
    
    @Override
    public void run() {
        while(true){
            //socketPrototyp.finish();
            try {
                bytesRead = in_IS.read(buffer);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            temp_incoming = &quot;&quot;;
            for (int i = 0; i < buffer.length; i++) {
                temp_incoming += &quot;&quot; + new Byte(buffer[i]).intValue();
            }
            write_test(&quot;lol_lauf&quot;);
            //socketPrototyp.set_textView_incoming_field(&quot;test&quot;);
        }
        
    }

}
Dann noch mal ein paar Fragen rund um dieses Thema.
Ich nutze ja derzeitig einen einfachen In- und OutputStream, da ich mir noch nie die größten Sorgen drum gemacht habe ob ich nun wirklich eine Exception haben will oder auch nicht. Aber aus den Erkenntnissen die ich hier ansammle soll später ein größeres Projekt folgen, daher meine Frage welche von den zig Stream Kombination soll ich wählen. Dann schmeiß ich auch mal ganz vorsichtig und fragend Datagramme in den Raum, Vor- und Nachteile.

Und ab und zu hab ich das Problem, das mir Eclipse einen Fehler in meinem Projekt angibt aber nicht sagt wo und wenn ich dann das Projekt wieder importiere ist alles wieder i.O. gibt es da vll weitere Infos darüber?

Das wars erst mal von meiner Seite aus und danke euch schonmal das ihr bis hier hin gelesen habt und freue mich schon auf eure Tipps und Tricks.

Und wie immer, bin ich im falschen Thread gelandet, bitte um eine kleine verschiebung.

NACHTRAG:
Kann es sein das mein inputStream.read() mein Thread blockiert und er deswegen nicht weiter geht. Den nun kommt zwar nicht mehr die Fehlermeldung, kann aber auch einfach nur daran liegen das er zu dem Punkt der den Fehler verursacht hat nicht hingelangte. Aber im Debuger konnte ich sehen das in meinem Byte Array der korrekte Wert eingetragen wurde.

NACHTRAG 2:
Mhhh aus dem Debug Mode mein ich zuerkennen das er beim setText des TextViews hängen bleibt, ist dies vll die total verkehrte Art und Weise einen Text auszugeben und den Text zuverändern.
 
Zuletzt bearbeitet:

Ähnliche Themen

M
Antworten
2
Aufrufe
631
Mozart40
M
M
Antworten
2
Aufrufe
1.309
maksimilian
M
M
  • maksimilian
Antworten
6
Aufrufe
1.004
jogimuc
J
Zurück
Oben Unten