需求說明:需求大概是這樣的紅外線激活門禁,門禁激活PC,PC激活Android,Android掃描EPCID,這里的最終要求設備掃描的時間由PC決定,剛開始想法是直接在Android端搭建一個基于NanoHttpd的微型服務器,后來弄清楚之后發現簡單多了
第一步:建立Android端的ServerSocket,并接受消息
創建一個ServerSocket,監聽端口為9999,端口可為任意一個未被占用的端口
private static void startService() {
try {
// 創建ServerSocket
ServerSocket serverSocket = new ServerSocket(9999);
Log.e("xxx","--開啟服務器,監聽端口 9999--");
// 監聽端口,等待客戶端連接
while (true) {
Log.e("xxx","--等待客戶端連接--");
Socket socket = serverSocket.accept(); //等待客戶端連接
Log.e("xxx","得到客戶端連接:" + socket);
startReader(socket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
====
接受客戶端發送的消息
private static void startReader(final Socket socket) {
new Thread() {
@Override
public void run() {
DataInputStream reader;
try {
// 獲取讀取流
reader = new DataInputStream(socket.getInputStream());
while (true) {
Log.e("xxx","*等待客戶端輸入*");
// 讀取數據
String msg = reader.readUTF();
Log.e("xxx","獲取到客戶端的信息:" + msg);
//想客戶端返回消息,可用來確認消息的到達
DataOutputStream ps = new DataOutputStream(socket.getOutputStream());
ps.writeUTF("已收到你發來的信息" + msg);
ps.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
以上2個方法就是一個簡單的Android端的服務器,比較簡短,看下注釋應該不難理解
第二步,創建連接,發送消息
連接另一臺作為服務端的Android設備
new Thread() {
@Override
public void run() {
try {
socket = new Socket("192.168.7.125", 9999);
Log.e("xxx", "建立連接:" + socket);
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
發送消息
new Thread() {
@Override
public void run() {
try {
// socket.getInputStream()
DataOutputStream writer = new DataOutputStream(socket.getOutputStream());
writer.writeUTF("消息內容"); // 寫一個UTF-8的信息
Log.e("xxx","發送消息");
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
這里得話我是用的另一臺Android手機作為客戶端,去連接服務端,并發送消息,需要注意的是前幾次是不成功的錯誤信息為沒有路由,后來ping一下模擬器的IP發現根本不通,所以先確保網絡是連通的,且記得App需要網絡權限,網絡操作在子線程,還有實際情況中通常客戶端會定時發送數據給服務端,確保鏈接沒有斷