Android作为服务端,PC推送消息
2017-09-07 本文已影响503人
妖苔
需求说明:需求大概是这样的红外线激活门禁,门禁激活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需要网络权限,网络操作在子线程,还有实际情况中通常客户端会定时发送数据给服务端,确保链接没有断