需求說(shuō)明:需求大概是這樣的紅外線激活門禁小作,門禁激活PC台汇,PC激活A(yù)ndroid苛骨,Android掃描EPCID,這里的最終要求設(shè)備掃描的時(shí)間由PC決定苟呐,剛開(kāi)始想法是直接在Android端搭建一個(gè)基于NanoHttpd的微型服務(wù)器痒芝,后來(lái)弄清楚之后發(fā)現(xiàn)簡(jiǎn)單多了
第一步:建立Android端的ServerSocket,并接受消息
創(chuàng)建一個(gè)ServerSocket牵素,監(jiān)聽(tīng)端口為9999严衬,端口可為任意一個(gè)未被占用的端口
private static void startService() {
try {
// 創(chuàng)建ServerSocket
ServerSocket serverSocket = new ServerSocket(9999);
Log.e("xxx","--開(kāi)啟服務(wù)器,監(jiān)聽(tīng)端口 9999--");
// 監(jiān)聽(tīng)端口笆呆,等待客戶端連接
while (true) {
Log.e("xxx","--等待客戶端連接--");
Socket socket = serverSocket.accept(); //等待客戶端連接
Log.e("xxx","得到客戶端連接:" + socket);
startReader(socket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
====
接受客戶端發(fā)送的消息
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","*等待客戶端輸入*");
// 讀取數(shù)據(jù)
String msg = reader.readUTF();
Log.e("xxx","獲取到客戶端的信息:" + msg);
//想客戶端返回消息请琳,可用來(lái)確認(rèn)消息的到達(dá)
DataOutputStream ps = new DataOutputStream(socket.getOutputStream());
ps.writeUTF("已收到你發(fā)來(lái)的信息" + msg);
ps.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
以上2個(gè)方法就是一個(gè)簡(jiǎn)單的Android端的服務(wù)器,比較簡(jiǎn)短赠幕,看下注釋應(yīng)該不難理解
第二步俄精,創(chuàng)建連接,發(fā)送消息
連接另一臺(tái)作為服務(wù)端的Android設(shè)備
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();
發(fā)送消息
new Thread() {
@Override
public void run() {
try {
// socket.getInputStream()
DataOutputStream writer = new DataOutputStream(socket.getOutputStream());
writer.writeUTF("消息內(nèi)容"); // 寫一個(gè)UTF-8的信息
Log.e("xxx","發(fā)送消息");
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
這里得話我是用的另一臺(tái)Android手機(jī)作為客戶端榕堰,去連接服務(wù)端竖慧,并發(fā)送消息,需要注意的是前幾次是不成功的錯(cuò)誤信息為沒(méi)有路由,后來(lái)ping一下模擬器的IP發(fā)現(xiàn)根本不通逆屡,所以先確保網(wǎng)絡(luò)是連通的圾旨,且記得App需要網(wǎng)絡(luò)權(quán)限,網(wǎng)絡(luò)操作在子線程,還有實(shí)際情況中通澄赫幔客戶端會(huì)定時(shí)發(fā)送數(shù)據(jù)給服務(wù)端砍的,確保鏈接沒(méi)有斷