無論是使用Wi-Fi模塊在單片機和電腦或手機之間進行數據傳輸,基本方法都是:
一臺設備建立服務端,一臺設備作爲客戶端連接,連接成功後即可進行通信。
一、服務端的建立
Java中建立服務端,不侷限於電腦才能建立,一臺手機同樣可以建立:
/**
* 建立服務端
*
* @param sp 建立服務端的通信端口
*/
private static void StartServer(int sp) {
try {
serverSocket = new ServerSocket(sp); //服務端使用ServerSocket建立
System.out.println("Server started at:" + InetAddress.getLocalHost());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new Thread(){
@Override
public void run() {
while (SERVER_ENABLE) { //循環監聽
try {
s = serverSocket.accept(); //在有客戶端連入之前,while循環將一直卡在這裏
new MasterServerThread(s).start(); //客戶端連接成功後,開啓一個自定義的服務器線程
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
}
二、服務線程
/**
* 服務器主線程
*/
private static class MasterServerThread extends Thread {
Socket masterSocket = null; //傳入的客戶端Socket
String socketKind = null;
//構造方法,在實例化本Class時要求傳入客戶端的socket
public MasterServerThread(Socket s) {
this.masterSocket = s;
}
@Override
public void run() {
BufferedReader bre = null;
try {
bre = new BufferedReader(new InputStreamReader(masterSocket.getInputStream(), "utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
while ((socketKind = bre.readLine()) != null) { //接收讀取傳輸過來的數據
//根據發過來的數據是什麼,決定進行指定操作
if (socketKind.contains(LOGIN_REQUEST)) {//TODO 處理登陸請求操作
//......
} else if (socketKind.contains(OPERATION_OF_BINDING_DEVICE)) {//TODO 處理設備綁定
//......
}
}
} catch (Exception e) {
//e.printStackTrace();
}
}
}
三、客戶端的連接
/**
* SERVER_IP : String型
* SERVER_PORT :int型
*/
Socket socket = new Socket(SERVER_IP, SERVER_PORT); //服務端用的ServerSocket,客戶端對應的是使用Socket
ClientThread ct = new ClientThread(socket); //同樣開啓客戶端線程,與服務器通信用
ct.start();
四、客戶端線程
/**
* Class : ClientThread
* 與服務端線程class十分相像
*/
private class ClientThread extends Thread {
Socket cSocket;
BufferedReader br;
public ClientThread(Socket s) {
this.cSocket = s;
}
@Override
public void run() {
try {
br = new BufferedReader(new InputStreamReader(cSocket.getInputStream(), "UTF-8"));
while ((temp = br.readLine()) != null) {
//Do Something...
}
}catch(IOException e){
e.printStackTrace();
}
}
}
五、發送消息
/**
* 發送登陸信息
* @param id 用戶ID
* @param pwd 賬號密碼
*/
private void sendLoginMsg(final String id, final String pwd) {
new Thread() {
@Override
public void run() {
try {
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
printWriter.println(LOGIN_REQUEST + "CONNECTION_FROM_APP" + "_" + id + "$" + pwd + "&");
printWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}