2015-01-28 1 views
1

간단한 블루투스 채팅을 프로그래밍하고 있습니다. 소켓을 처리하여 메시지를 보내고 싶으면 구현 한 방법을 사용하는 방법을 모른다.Android Sockets

나는 내 코드를 부착하고 어떤 하나 ...

을 도와하는 방법을 알고 있다면 나는, 스레드와 연결을 만들 듣고 소켓을 작성하는 방법이있다. 하지만 메인 (onCreate)에서 사용하는 방법을 모르겠습니다.

감사합니다.

public class messages_activity extends Activity { 
private Button send; 
private TextView message; 
private EditText write; 

private BluetoothSocket transferSocket; 

private BluetoothAdapter mBluetoothAdapter; 
final UUID applicationUUID = UUID.fromString("27012F0C-68AF-4FBF-8DBE-6BBAF7AA432A"); 


private boolean listening = false; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.messages); 
    send = (Button) findViewById(R.id.button4); 
    message = (TextView) findViewById(R.id.textView2); 
    write = (EditText) findViewById(R.id.editText); 

    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 

    Intent intent = getIntent(); 
    String macAddress = intent.getStringExtra("MacAddress"); //On macAddress I receive the macAddress of the other device that I want to send and receive 

    BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(macAddress); 

    startServerSocket(mBluetoothAdapter); 
    connectToServerSocket(device, applicationUUID); 



    send.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      sendMessage(transferSocket, write.getText().toString()); //write is a textField when I write what I want to send 
     } 
    }); 



} 

//Bluetooth Socket Server Connection 

private UUID startServerSocket(BluetoothAdapter bluetooth){ 

    try{ 
     final BluetoothServerSocket btserver = bluetooth.listenUsingRfcommWithServiceRecord(mBluetoothAdapter.getName(), applicationUUID); 

     Thread acceptThread = new Thread(new Runnable() { 
      public void run() { 
       try{ 
        //Block until client connection established 
        BluetoothSocket serverSocket = btserver.accept(); 
        //Start listening for messages 
        StringBuilder incoming = new StringBuilder(); 
        listenForMessages(serverSocket, incoming); 
        //Add a reference to the socket used to send messages 
        transferSocket = serverSocket; 
       }catch (IOException e){} 
      } 
     }); 

     acceptThread.start(); 

    }catch (IOException e){} 

    return applicationUUID; 
} 



//Creating a Bluetooth client socket 
private void connectToServerSocket (BluetoothDevice device, UUID uuid){ 
    try { 
     BluetoothSocket clientSocket = device.createRfcommSocketToServiceRecord(applicationUUID); 

     //Block until server connection accept 
     clientSocket.connect(); 

     //Start listening for messages 
     StringBuilder incoming = new StringBuilder(); 
     listenForMessages(clientSocket, incoming); 


     //Add a reference to the socket used to send messages 
     transferSocket = clientSocket; 

     }catch (IOException e){} 
} 


private void sendMessage(BluetoothSocket socket, String message) { 
    OutputStream outStream; 
    try { 
     outStream = socket.getOutputStream(); 

     // Add a stop character. 
     byte[] byteArray = (message + " ").getBytes(); 
     byteArray[byteArray.length - 1] = 0; 

     outStream.write(byteArray); 
     outStream.flush(); 
    } catch (IOException e) { 
    } 
} 



private void listenForMessages(BluetoothSocket socket, StringBuilder incoming){ 
    listening = true; 
    int bufferSize = 1024; 
    byte[] buffer = new byte[bufferSize]; 
    try{ 
     InputStream instream = socket.getInputStream(); 
     int bytesRead = -1; 
     while(listening){ 
      bytesRead = instream.read(buffer); 
      if(bytesRead != -1){ 
       String result = ""; 
       while((bytesRead == bufferSize) && (buffer[bufferSize-1] != 0)){ 
        result = result + new String (buffer, 0, bytesRead - 1); 
        bytesRead = instream.read(buffer); 
       } 
       result = result + new String (buffer, 0, bytesRead - 1); 
       incoming.append(result); 
       message.setText(incoming); //message is a textview to show what I've received 

      } 
      socket.close(); 
     } 
    }catch(IOException e){} 
    finally { 

    } 

} 

답변

0

코드가 작동하지 않아 작동하지 않습니다.

listenForMessages는 메시지 textview에 삽입 된 수신 메시지를 표시합니다. message.setText (incoming);

이렇게하면 화면에 표시됩니다. 당신이 채팅을 원하는 경우에, 당신은 같은 일을해야

:

  1. 하는 송신 상자에 텍스트를 입력 보내기를 클릭합니다.
  2. send.onClickListener의 onClick 메서드에서 메시지를 보내는 messagetext (채팅 창) 상자에 줄을 추가하십시오. ME : 안녕하세요! 잘 지냈어요?
  3. 그런 다음 메시지 텍스트 상자를 지우십시오.
  4. 그러면 onClick 메서드는 코드로 메시지를 보냅니다.
  5. 메시지를 수신하면 listenForMessage는 수신 된 메시지를 채팅 창 : ID : 메시지에 추가해야합니다. 친구 : 나는 모두 눈이 내렸다? 당신?

이제 다른 메시지를 보낼 준비가되었습니다.

+0

그러나 문제는 소켓에 관한 것입니다. thread.accept()를 실행할 수있게되면 sendSocket에 다른 메서드에서 송신 및 수신 대기 할 수있는 소켓을 가져야합니다. startServerSocket (mBluetoothAdapter); // 보내고들을 소켓을 만듭니다. 그리고 이제이 소켓을 sendmessage (transferSocket)에 넣을 수 있습니다. 그러나 transferSocket은 null입니다. 나는 디버깅을 해봤고 그것을 보았다. –

+0

오, 죄송합니다. 내가 잘못한 부분을 찾기 위해 취하는 모든 단계를 검증하는 코드를 추가 할 것입니다. Android.Bluetooth.BluetoothAdapter.CheckBluetoothAddress를 사용하여 사용중인 Mac 주소가 유효한지 확인하십시오. –

+0

필자가 보았던 코드 예제에서 블루투스 어댑터를 만든 후에는 BluetoothAdapter.enable을 활성화해야합니다. –

관련 문제