Socketverbindung mit Java und JavaME

Ansics

Cadet 4th Year
Registriert
Mai 2003
Beiträge
107
Hi,

Ich möchte gerne einen J2ME Clienten auf meinem Handy mit ner Javaanwendung auf meinem Rechner verbinden. Ich benutze Sockets um die Kommunikation zu ermöglichen.

Mein J2Me Client hat nix besonderes. Nur nen Textfeld und nen "Send"-Button. Wenn ich auf "Send" drücke, soll der Inhalt des Textfeldes an meine Javaanwendung auf dem Rechner gesendet werden, in upperCase zurückkommen und als Alert aufm Handy angezeigt werden.
Hier der Code vom J2ME Client. Der "Send"-Button ruft nur die Funktion send() auf. socket ist hier vom Typ StreamConnection und os bezeichnet einen OutputStream.

Code:
public void send(String message) throws IOException {
		os = socket.openOutputStream();
		os.write(message.getBytes());
		os.close();
		is = socket.openInputStream();
		receive();
		st.showReply(lastReceivedMessage);
	}
	
	public void receive() {
		try {
			int MAX_LENGTH = is.available();
			byte[] buf = new byte[MAX_LENGTH];
	        int total = 0;
	        while (total < MAX_LENGTH) {
	            int count = is.read(buf, total, MAX_LENGTH - total);
	            if (count < 0) {
	                break;
	            }
	            total += count;
	        }
	        is.close();
	        lastReceivedMessage = new String(buf, 0, total);	        
		} catch(Exception ignored) {};
	}

Der Code von der Javaanwendung auf meinem Rechner ist:

Code:
try {
        	while (true) {	
        		receive();
        		send();
        	}
} catch (Exception ignored) {}

private void send() {
		try {
			out.write(lastReceivedMessage.toUpperCase()); 
			out.newLine();
			out.flush();
		} catch (Exception ignored) {}
	}

private void receive() {
		try {
			lastReceivedMessage = in.readLine();
		} catch (IOException io) {}
	}

Wie gesagt: Das ganze Prozedere läuft genau einmal, danach passiert folgendes: Die Javaanwendung bleibt nicht mehr (wie beim ersten mal) bei in.readLine(); stehen, sondern läuft da einfach munter weiter. Normalerweise müsste die Anwendung doch da stehen bleiben. Wieso übergeht sie die Zeile ab dem zweiten mal immer?
Ich will halt, dass nur einmal ne Socketverbindung aufgebaut wird. Die Javaanwendung soll die ganze Zeit (while true) lauschen, ob vom Handy neue Nachrichten kommen. Dabei soll sie jedesmal, wenn sie zur Zeile mit in.readLine(); kommt, stehen bleiben.

Was mach ich falsch? Geht das überhaupt so wie ich mir das vorstelle, oder muss ich für jede neue Nachricht die komplette Socketverbindung neu aufbauen?

Danke für Eure Mühe!!

Ansics
 
Hallo,

falls du die Exceptions nicht ignorieren würdest, wäre es dir wahrscheinlich klar.

Jedenfalls schliesst du die Streams immer nach jedem schreiben/lesen, das bewirkt, dass beim 2ten mal lesen eine Exception geworfen wird, da der Socket Stream ja zu ist.

Erstelle die Streams nicht in den send/recieve methoden sonder einmal global. In der send methode rufe .flush() auf. Falls alles gesendet und empfangen ist, kannst du .close aufrufen (beim Socket genügt).

das sollte dein Problem lösen, auf andere Sachen gehe ich mal nicht ein ;)
 
Hi,

erstmal danke für deine Antwort. Hab die Streams jetzt einmal beim inizialisieren erstellt, hab jetzt aber ein Problem: bei in.ReadLine kommt der Serverprozess jetzt gar nicht mehr weiter. Der J2ME client ruft erst write() auf und direkt danach dann flush(). Am Server kommt aber anscheinend nichts an :-(
 
in.readLine wartet auf ein Zeilenende, dh, sende message+"\n" falls dein Text keine Zeilen enthalten sollte
 
Zurück
Oben