Поддержание живого соединения Java Bluetooth

Я создаю простой Java-сервер Bluetooth для моего компьютера с использованием API Bluecove. Я также создаю клиентское приложение для Android, но проблема, похоже, связана с серверным приложением.

Я уверен, что кто-то уже опубликовал любой ответ где-нибудь, и я в течение последних нескольких дней строго пробовал разные решения и просматривал все возможные форумы, но, похоже, не могу сохранить соединение в потоке сокетов.

Я могу обмениваться сообщениями после того, как установлено соединение с Android на компьютер и наоборот с компьютера на Android, но сразу после обмена байтами стек Bluecove закрывается и закрывает соединение с сокетом, даже если я явно не говорю ему connection.close().

Я пытался использовать цикл while(некоторые утверждения верны), чтобы сохранить соединение, и он больше не выключает сокет после получения первого сообщения, но не может принимать любые последующие сообщения, которые я отправляю со своего смартфона на мой компьютер или. Хотя он по сути живой, он не может получать новые сообщения, когда я пытаюсь отправить их со смартфона. Не уверен почему.

Извините, это мой первый пост, и я не уверен, почему первая часть кода не отображается должным образом на странице.

Кодовое соединение:

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) {}
}

РЕЗЬБОВЫЙ КОД ДЛЯ СЛУШАТЬ ДОХОДНЫЕ ДАННЫЕ

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){}
}

1 ответ

К сожалению, я не могу попробовать ваш код на моей машине в режиме реального времени, но я думаю, что видел вашу ошибку: в вашем run()- метод, который вы читаете из потока ввода, выводите его на консоль, и затем он заканчивается. После вашей последней строки

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

ваш run()- метод завершен, и поток отбрасывается средой выполнения. Вам нужно было бы поместить получатель в цикл while(true) или while(running).

Я изменил ваш код, и вот он, однако, имейте в виду то, что я сказал раньше: я не смог его протестировать, поэтому он полностью не проверен!

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();
            }
        }
    }
}

Вот несколько общих моментов и мыслей о моем и вашем коде:

  • Как видите, в основном потоке я принимаю только новое соединение. Как только клиент подключился, я передаю объект подключения потоку. Затем он начинает общаться с клиентом
  • В Java мы обычно ставим открывающие скобки в той же строке, что и оператор, который его запрашивает, но это просто деталь, а не необходимость.
  • ВСЕГДА делать что-то с исключениями или не ловить их. Поэтому минимум - это printStacktrace() или для объявления вашего метода с помощью throws xException, но не перехватывайте и не игнорируйте их.

В следующий раз, когда вы публикуете что-то здесь, я бы порекомендовал включить все ваши заявления об импорте и т. Д., Это может помочь людям, которые пытаются вам помочь. (иногда импорт может быть причиной всех проблем, например, когда кто-то импортировал java.awt.List вместо java.util.List)

Я надеюсь, что я вам помог!

Другие вопросы по тегам