5.29日音訊,手機與PC實現(xiàn)通信功能。終端持續(xù)掃描AP信息并發(fā)送給服務器端的實現(xiàn)。首先基于TCP協(xié)議在Android終端和PC兩端之間形成網(wǎng)絡虛擬鏈路。使用ServerSocket創(chuàng)建TCP服務器端,然后在Android客戶端使用Socket的構造器來連接服務器。其中Android終端通過WIFI連接和PC處于同一局域網(wǎng)。
1.PC服務器啟用ServerSocket
兩個通信實體在建立虛擬鏈路之前,需要有一方先準備好,主動接受來自其他通信實體的連接請求。
使用ServerSocket對象監(jiān)聽來自客戶端的Socket連接。
[plain]//創(chuàng)建ServerSocket對象
ServerSocketss=newServerSocket(30000);
//監(jiān)聽來自客戶端的請求
while(true){
Sockets=ss.accept();
…
}
//創(chuàng)建ServerSocket對象
ServerSocketss=newServerSocket(30000);
//監(jiān)聽來自客戶端的請求
while(true){
Sockets=ss.accept();
…
}
如果沒有連接,則將一直處于等待狀態(tài)。當接收到連接請求后,獲取消息到輸入流,并保存到文件。
[plain]/接收客戶端消息
BufferedReaderin=newBufferedReader(newInputStreamReader(client.getInputStream()));
Stringstr;
BufferedWriterbw=newBufferedWriter(newFileWriter("D:/ApInfo"+(i++)+".txt"));
while((str=in.readLine())!=null){
System.out.println(str);
bw.write(str);
bw.newLine();
}
//接收客戶端消息
BufferedReaderin=newBufferedReader(newInputStreamReader(client.getInputStream()));
Stringstr;
BufferedWriterbw=newBufferedWriter(newFileWriter("D:/ApInfo"+(i++)+".txt"));
while((str=in.readLine())!=null){
System.out.println(str);
bw.write(str);
bw.newLine();
}
2.Android終端使用Socket通信
客戶端使用Socket的構造器連接服務器,指定服務器IP和端口號就可以了。
Sockets=newSocket(“192.168.1.100”,30000);
這樣服務器端的accept()方法就得到響應,從而向下執(zhí)行,服務器端和客戶端就形成了一對互相連接的Socket。再進行通信時就沒有服務器和客戶端之分了,都是通過輸入輸出流進行通信。
詳細步驟:
采用Handler和TimerTask來定時掃描AP信息并發(fā)送給服務器端。TimerTask規(guī)定了到達指定的時間所要進行的任務。
[plain]TimerTasktask=newTimerTask(){
publicvoidrun(){
Messagemessage=newMessage();
message.what=1;
handler.sendMessage(message);
}
};
TimerTasktask=newTimerTask(){
publicvoidrun(){
Messagemessage=newMessage();
message.what=1;
handler.sendMessage(message);
}
};
handler傳遞message內(nèi)容:
[plain]Handlerhandler=newHandler(){
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
case1:
//執(zhí)行定時器時間到了之后由handler傳遞的任務
break;
}
super.handleMessage(msg);
}
};
Handlerhandler=newHandler(){
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
case1:
//執(zhí)行定時器時間到了之后由handler傳遞的任務
break;
}
super.handleMessage(msg);
}
};
接下來掃描AP信息并發(fā)送給服務器端,然后將結(jié)果保存。
[plain]WifiManagerwifiManager=(WifiManager)getSystemService(WIFI_SERVICE);
wifiManager.startScan();
mWifiList=wifiManager.getScanResults();
WifiManagerwifiManager=(WifiManager)getSystemService(WIFI_SERVICE);
wifiManager.startScan();
mWifiList=wifiManager.getScanResults();
由WifiManager說明可知,它可以用于處理已配置的網(wǎng)絡,當前連接的網(wǎng)絡及AP信息的掃描等情況。
向服務器發(fā)送消息:
[plain]socket=newSocket("192.168.1.211",30000);
//向服務器端發(fā)送消息
PrintWriterout=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);
out.println(message);
socket=newSocket("192.168.1.211",30000);
//向服務器端發(fā)送消息
PrintWriterout=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);
out.println(message);
其中message為獲取的AP信息,測試收到的信息格式為:
SSID:ICIS_LAB,BSSID:1c:af:f7:9a:65:e4,capabilities:[WPA-PSK-TKIP+CCMP],level:-80,frequency:2437