因為是藍牙聊天的app。。真機連不上電腦無法除錯。。。逐漸崩潰。。
寫的代碼比較小白 請見諒。。
總的問題描述:(客戶端和服務端的接收和發送代碼基本相同)
每次選擇了一個藍牙設備,客戶端去連接服務端,服務端accept,開啟接收流執行緒,客戶端也立馬開啟接收流執行緒
希望的是連接之后立馬在后端交換資料庫資訊,用戶看不見,交換完資料庫資料之后開啟訊息接收發送
兩個接收流啟動之后,我再呼叫 輸出資料庫 的函式 但是每次都立馬閃退 找不到原因 因為完全無法除錯= = 應該是我不會調。。。絕望。。
運行思路是:
開啟了監聽執行緒AcceptThread
BluetoothServerSocket.accept()等待連接,連接了之后啟動 接收流 阻塞接收資料
//阻塞在這里,等待別的設備連接
socket = mServerSocket.accept();
//setListenState(SERVING);//我是服務器
sockets.add(socket);//加入串列
//out(socket);
connected(socket,false);
re=new receiveThread(socket);
re.start();//接收流
isSuc=true;
if(isSuc)
{
customD.show();//提示框 如果點了確認就會開啟write方法 往客戶端寫本地資料庫的所有資料
isSuc=false;
}
提示框確認鍵的設定
customD.setConfirm("confirm", new CustomDialog.IOnConfirmListener(){
@Override
public void onConfirm(CustomDialog dialog) {
Toast.makeText(mContext, "確認成功!",Toast.LENGTH_SHORT).show();
try {
mAcceptThread.re.DBout();
} catch (IOException e) {
e.printStackTrace();
}
}
});(安卓開發)
啟動的方法輸出資料庫全部的內容
public void DBout() throws IOException {
String end="messageEND";
List<TUsers> other_Row = p.findAllLocal();//查詢全部的表資訊
if (other_Row.size() > 0) {
for (TUsers row : other_Row) {
String t= TtoString(row);//自己寫的一個方法 將表的每一行轉換成string型別
mOutStream.write(t.getBytes());
}
mOutStream.write(end.getBytes());//結束標志
//mOutStream.flush();
}
}接收read的執行緒長這樣 re=new receiveThread(socket); re.start();//接收流
public void run(){
try {
setListenState(SERVING);
byte[] buffer = new byte[MAX_BUFFER_SIZE];
int bytes;
InputStream tmpIn = null;
OutputStream tmpOut = null;
//從連接的Socket中獲取讀資料和寫資料的流介面
try {
// br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
tmpIn = rSocket.getInputStream();
tmpOut = rSocket.getOutputStream();
} catch (IOException e) {
setConnectState(CONNECT_STATE_IDLE);
rSocket = null;
mConnectedThread = null;
return;
}
mInStream = tmpIn;
mOutStream = tmpOut;
//讀取資料
while (!mUserCancel) {
//阻塞在這里,用流介面等待讀取資料
bytes = mInStream.read(buffer);
if (isFirst) {//接收資料庫的資訊
byte[] data = new byte[bytes];
System.arraycopy(buffer, 0, data, 0, bytes);
String t1 = new String(data);
if (t1.equals("messageEND")) {
isFirst = false;
}else{
TUsers te = StoTuser(t1);
p.connected_Insert(te, rSocket.getRemoteDevice().getAddress());
continue;
}
}
//將ConnectionManager的連接狀態修改成CONNECT_STATE_CONNECTED
setConnectState(CONNECT_STATE_CONNECTED);
if(dd==1){
msg = "sys:##" + "歡迎" + rSocket.getRemoteDevice().getName() + "進入聊天室,當前聊天室人數為" + (sockets.size() + 1);
sendData(msg.getBytes(StandardCharsets.UTF_8), true);//--------進入聊天室的訊息
//setListenState(LISTEN_STATE_IDLE);
dd++;
}
try {//這里接收聊天的訊息
//將讀取到的資料傳遞給關注它的組件
if (mConnectionListener != null && bytes > 0) {
byte[] data = new byte[bytes];
System.arraycopy(buffer, 0, data, 0, bytes);
byte[] temp;
byte[] temp1;
msg = rSocket.getRemoteDevice().getName() + ":";
temp1 = msg.getBytes();
temp = byteMerger(temp1, data);
//發給除了讀者之外的設備
for (int i = 0; i < sockets.size(); i++) {
if (!(rSocket.getRemoteDevice().getAddress().equals(sockets.get(i).getRemoteDevice().getAddress())))
sockets.get(i).getOutputStream().write(temp);
}
mConnectionListener.onReadData(temp);
}
} catch (IOException e) {
//阻塞程序中,如果其它地方呼叫了mSocket.close(),
//或者對方的連接關閉
//將會進入到這個例外當中
break;
}
}
}catch(Exception e){
e.printStackTrace();
}
setListenState(LISTEN_STATE_LISTENING);
setConnectState(CONNECT_STATE_IDLE);
}//run
上面的都是服務端
客戶端的接收是
try {
bytes = mInStream.read(buffer);
//這里是想先服務端write資訊給客戶端之后,客戶端再write自己的資料庫資訊
if(dd==1){
DBout();
dd++;
}
if (isFirst) {
byte[] data = new byte[bytes];
System.arraycopy(buffer, 0, data, 0, bytes);
String t1 = new String(data);
if (t1.equals("messageEND")) {
isFirst = false;
dd++;
}else {
TUsers te = StoTuser(t1);
p.connected_Insert(te, mSocket.getRemoteDevice().getAddress());
continue;
}
}
//將ConnectionManager的連接狀態修改成CONNECT_STATE_CONNECTED
setConnectState(CONNECT_STATE_CONNECTED);
//讀取資料
//將讀取到的資料傳遞給關注它的組件
if (mConnectionListener != null && bytes > 0) {
byte[] data = new byte[bytes];
System.arraycopy(buffer, 0, data, 0, bytes);
mConnectionListener.onReadData(data);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/104583.html
標籤:Java相關
上一篇:線上交作業及批改作業怎么實作
下一篇:初學java,求大神指點一下
