Maintenir la connexion Bluetooth Java en vie


Je construis un serveur Java Bluetooth simple pour mon ordinateur en utilisant l'API Bluecove. Je construis également une application côté client Android, mais le problème semble provenir de l'application côté serveur.

Je suis sûr que quelqu'un a déjà posté une réponse quelque part et j'ai essayé différentes solutions rigoureusement ces derniers jours et regardé tous les forums possibles, mais je n'arrive pas à garder la connexion sur le thread de socket vivante.

Je peux échanger un message après un la connexion est établie d'Android à l'ordinateur et vice versa d'ordinateur à android, mais immédiatement après l'échange des octets, la pile Bluecove s'arrête et ferme la connexion socket même lorsque je ne le dis pas explicitement à la connexion.proche().

J'ai essayé d'utiliser une boucle while(une instruction est true) pour maintenir la connexion en vie et elle n'arrête plus le socket après avoir reçu le premier message mais elle ne peut recevoir aucun message ultérieur que j'envoie de mon smartphone à mon ordinateur. Bien qu'il soit essentiellement vivant, il ne peut pas recevoir de nouveaux messages lorsque j'essaie de les envoyer depuis le smartphone. Je ne sais pas pourquoi.

Je suis désolé, c'est ma première publication et je ne sais pas pourquoi la première partie du code ne s'affiche pas correctement sur la page.

Code établissant la connexion:

public BluetoothServer()
{
    try 
    {
        service = (StreamConnectionNotifier) 
             Connector.open("btspp://localhost:" + new UUID(0x1101).toString() + 
                                ";name=SampleServer");

            System.out.println("open connection");



            while(runState == true){

                connection = (StreamConnection) service.acceptAndOpen();

//send a greeting across to android
                    outputStream = connection.openOutputStream();
                    String greeting = "JSR-82 RFCOMM server says hello";
                    outputStream.write(greeting.getBytes());

//run thread that listens for incoming bytes through socket connection
                Thread t = new Thread(new ConnectedThread(connection));
                t.start();

            }

    } catch(IOException e) {}
}

CODE DE THREAD POUR ÉCOUTER LES DONNÉES ENTRANTES

public void run()
{
    try
    {    
            //open input stream to listen to data
            inputStream = connection.openInputStream();              

            byte buffer[] = new byte[1024];
            int bytes_read = inputStream.read(buffer);

            String received = new String(buffer, 0, bytes_read);
            System.out.println("received: " + received);

    } 
        catch(IOException e){}
}
Author: Saju, 2013-02-12

1 answers

Malheureusement, je ne peux pas essayer votre code sur ma machine en vrai, mais je pense avoir vu votre erreur: dans votre run()-Méthode, vous lisez à partir du flux d'entrée, imprimez-le sur la console, puis c'est terminé. Après votre dernière ligne

        System.out.println("received: " + received);

Votre méthode run () est terminée et le thread est rejeté par le runtime. Vous devrez mettre la réception dans une boucle while(true) ou while(running).

J'ai modifié votre code et le voici, mais gardez à l'esprit ce que j'ai dit auparavant: je n'ai pas pu tester il, donc il est totalement non testé!

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

import javax.bluetooth.UUID;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.io.StreamConnectionNotifier;


public class BluetoothServer {

    private boolean runState = true;

    public BluetoothServer(){

        try {
            StreamConnectionNotifier service = (StreamConnectionNotifier) Connector.open("btspp://localhost:" + new UUID(0x1101).toString() + ";name=SampleServer");
            System.out.println("open connection");

            while(runState == true){
                StreamConnection connection = (StreamConnection) service.acceptAndOpen();
                new Listener(connection).start();
            }

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

    private class Listener extends Thread{

        private OutputStream os;
        private InputStream is;

        public Listener(StreamConnection connection){
            try {
                this.os = connection.openOutputStream();
                os.flush();
                this.is = connection.openInputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void run(){
            StringBuilder builder;
            try{
                String greeting = "JSR-82 RFCOMM server says hello";
                os.write(greeting.getBytes());

                while(true){
                    builder = new StringBuilder();
                    int tmp = 0;
                    while((tmp = is.read()) != -1){
                        builder.append((char) tmp);
                    }
                    System.out.println("received: " + builder.toString());
                }
            } 
            catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}

Voici quelques points généraux et réflexions sur le mien et votre code:

  • Comme vous pouvez le voir, dans le thread principal, je n'accepte qu'une nouvelle connexion. Dès qu'un client est connecté, je donne l'objet de connexion au thread. Il commence alors à communiquer avec le client
  • En Java, nous mettons normalement des crochets d'ouverture sur la même ligne que l'instruction qui le demande, mais ce n'est qu'un détail et non un must.
  • TOUJOURS faire quelque chose avec des exceptions ou ne les attrapez pas. Donc, le minimum est un printStacktrace () ou de déclarer votre méthode avec "throws xException" mais ne les attrapez pas et ne les ignorez pas.

Pour la prochaine fois que vous publierez quelque chose ici, je recommanderais d'inclure toutes vos déclarations d'importation, etc. il peut aider les gens qui essaient de vous aider. (parfois, une importation peut être la cause de tous les problèmes, par exemple lorsque quelqu'un a importé java.awt.Liste au lieu de java.util.Liste)

J'espère que je vous ai aidé!

 0
Author: Christian, 2015-03-17 21:23:04