Поддержание живого соединения 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)
Я надеюсь, что я вам помог!