2013-02-11 63 views
8

Tôi đang xây dựng một máy chủ Java Bluetooth đơn giản cho máy tính của mình bằng API Bluecove. Tôi cũng đang xây dựng ứng dụng khách của Android nhưng vấn đề dường như bắt nguồn từ ứng dụng phía máy chủ.Giữ kết nối Java Bluetooth còn sống

Tôi chắc chắn ai đó đã đăng bất kỳ câu trả lời nào ở đâu đó và tôi đã thử các giải pháp khác nhau một cách chặt chẽ trong vài ngày qua và xem mọi diễn đàn có thể có nhưng tôi dường như không giữ kết nối trên chuỗi ổ cắm còn sống.

Tôi có thể trao đổi tin nhắn sau khi kết nối được thiết lập từ android sang máy tính và ngược lại từ máy tính sang android nhưng ngay sau khi các byte được trao đổi, ngăn xếp Bluecove tắt và đóng kết nối ổ cắm ngay cả khi tôi không nói rõ ràng với connection.close().

Tôi đã cố gắng sử dụng một vòng lặp (một số câu lệnh đúng) để giữ kết nối còn hoạt động và không còn tắt ổ cắm sau khi nhận được tin nhắn đầu tiên nhưng không nhận được bất kỳ tin nhắn nào sau đó điện thoại thông minh với máy tính của tôi. Mặc dù về cơ bản nó vẫn còn sống, nhưng nó không thể nhận được bất kỳ tin nhắn mới nào khi tôi cố gắng gửi chúng từ điện thoại thông minh. Không chắc chắn lý do tại sao.

Tôi xin lỗi, đây là lần đầu tiên tôi đăng và tôi không chắc tại sao phần đầu tiên của mã không hiển thị chính xác trên trang.

Mã thực hiện kết nối:

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

THREAD MÃ để nghe ĐE DỮ LIỆU

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

Bạn không thể gửi nhiều tin nhắn từ Máy khách đến Máy chủ, nhưng bạn có thể Gửi nhiều tin nhắn từ Máy chủ đến Máy khách không? Vòng lặp nào gọi phương thức run() của bạn? Bạn có thể cung cấp mã này gọi chạy() không? –

+0

Trong quá khứ tôi gặp phải vấn đề rất giống nhau. Nhưng trong trường hợp của tôi, kết nối không được đóng lại, chỉ có tốc độ IO bị chậm lại (ở phía Android). Sau khi gỡ lỗi, chúng tôi phát hiện ra, sau một thời gian không hoạt động, nó xảy ra ở phía Android sau khi hết thời gian chờ cụ thể (chế độ an toàn của thiết bị chuyển mạch Android) và thời gian chờ này không thể thay đổi. Để giữ kết nối còn sống, chúng tôi chỉ định gửi gói rỗng (một byte). Hy vọng nó sẽ giúp. – Eugene

+0

Không chỉ sử dụng các khối try/catch trống. Đăng nhập ngoại lệ khi nó được ném ra, nó sẽ giúp bạn có được lý do thực sự. Nếu không, bạn đang đoán. – Don

Trả lời

0

Đáng tiếc là tôi không thể thử mã của bạn trên máy tính của tôi trong thời gian thực, nhưng tôi nghĩ rằng tôi thấy lỗi của bạn : trong chạy của bạn() - Phương pháp bạn đọc từ dòng đầu vào, in nó vào giao diện điều khiển và sau đó nó là hơn. Sau dòng cuối cùng của bạn

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

hoạt động của bạn() - Phương thức kết thúc và luồng được hủy bỏ theo thời gian chạy. Bạn sẽ cần phải đặt tiếp nhận trong một thời gian (true) hoặc trong khi (chạy) vòng lặp.

Tôi đã sửa đổi mã của bạn và ở đây nó là, tuy nhiên hãy ghi nhớ những gì tôi đã nói trước đây: Tôi không thể chạy thử nó, do đó, nó đến hoàn toàn chưa được kiểm tra!

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

Dưới đây là một vài điểm chung và những suy nghĩ về mỏ và mã của bạn:

  • Như bạn có thể thấy, trong các chủ đề chính tôi chỉ chấp nhận một kết nối mới. Ngay sau khi một khách hàng kết nối, tôi đưa đối tượng kết nối vào luồng. Sau đó, nó bắt đầu giao tiếp với khách hàng
  • Trong Java, chúng ta thường đặt các dấu ngoặc mở trên cùng một dòng với câu lệnh yêu cầu nó, nhưng đây chỉ là một chi tiết chứ không phải là phải.
  • ALLWAYS làm điều gì đó có ngoại lệ hoặc không bắt được chúng. Vì vậy, tối thiểu là một printStacktrace() hoặc để khai báo phương thức của bạn với "throws xException" nhưng không bắt và bỏ qua chúng.

Lần sau bạn đăng nội dung nào đó ở đây, tôi khuyên bạn nên bao gồm tất cả các câu nhập, v.v., nó có thể giúp những người đang cố gắng giúp bạn. (đôi khi, việc nhập có thể là nguyên nhân gây ra mọi sự cố, ví dụ khi ai đó nhập java.awt.List thay vì java.util.Danh sách)

Tôi hy vọng rằng tôi đã giúp bạn!