用Android studio 建立一个tcp服务端,想设置成一次只允许一个客户端连接,
即accept建立一个连接之后,就把服务端socket关闭,不让其他客户端连接。
在处理完后,再将端口释放再次使用。
想知道使用Android studio怎么实现这样的功能。
private ServerSocket mServerSocket;
private Socket mSocket;
private void openService() {
try {
mServerSocket = null;
mServerSocket = new ServerSocket(5000);//端口号5000
} catch (Exception e) {
e.printStackTrace();
log("服务开启失败");
return;
}
log("服务开启成功");
//启动服务线程
SocketAcceptThread socketAcceptThread = new SocketAcceptThread();
socketAcceptThread.start();
}
/**
* 连接线程
* 得到Socket
*/
class SocketAcceptThread extends Thread {
@Override
public void run() {
try {
//等待客户端的连接,Accept会阻塞,直到建立连接,
//所以需要放在子线程中运行
mSocket = mServerSocket.accept();
mServerSocket.close();//关键是这一步,当ServerSocket收到客户端连接之后,关闭ServerSocket
//启动消息接收线程
log("socket开启中");
startReaderService(mSocket);
log("socket开启成功");
} catch (IOException e) {
e.printStackTrace();
log("socket开启失败");
}
}
}
/**
* 从参数的Socket里获取最新的消息
*/
private void startReaderService(final Socket socket) {
new Thread() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
// MsgInfo msgInfo = new MsgInfo(2, mServerIP, "开启成功");
// msgInfo.setCreatDate(System.currentTimeMillis());
// msgInfo.setCreatTime(getDateToString(msgInfo.getCreatDate()));
// mAdapter.addData(msgInfo);
mBinding.btSend.setEnabled(true);
}
});
DataInputStream reader;
try {
// 获取读取流
reader = new DataInputStream(socket.getInputStream());
while (isOpenService) {
// 读取数据
String msg = reader.readUTF();
log("客户端的信息:" + msg);
//发消息更新UI
Message message = new Message();
message.what = 1;
message.obj = msg;
serviceHandler.sendMessage(message);
try {
SystemClock.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
log("断开连接导致异常");
e.printStackTrace();
if (mSocket != null) {
try {
mSocket.close();
} catch (IOException ioException) {
ioException.printStackTrace();
} finally {
mSocket = null;
}
openService();//当前客户端断开连接之后,重新开启ServerSocket,等待连接
}
}
}
}.start();
}