介绍:本文主要介绍在安卓中使用Socket创建服务端和客户端进行通信,服务端可以管理多个客户端连接,完善的异常处理,接口回调,可以满足大部分需求,更多功能自行拓展…
关于Socket套接字:
是网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
使用Socket进行网络通讯的一般步骤如下:
- 创建Socket对象,指定服务器的IP地址和端口号。
- 使用Socket对象的getInputStream()和getOutputStream()方法获取输入输出流,用于接收和发送数据。
- 使用输出流发送请求到服务器,使用输入流读取服务器返回的数据。
- 使用完毕后,通过调用Socket对象的close()方法关闭Socket连接。
创建Socket服务端
功能包括启动服务,关闭连接,发送消息,接收消息,管理客户端,将事件回调给外界等
class SocketServer(private val port: Int, private val listener: SocketServerListener? = null) : Thread() {
private val TAG = "SocketServer"
private lateinit var serverSocket: ServerSocket // serverSocket 对象
private val clientHandlers = mutableListOf<ClientHandler>() // 存储每个客户端线程
private val executor = Executors.newSingleThreadExecutor()
override fun run() {
startServer()
}
// 启动服务器的方法
private fun startServer() {
try {
serverSocket = ServerSocket(port)
Log.i(TAG, "Server is running on port $port")
while (!isInterrupted) {
val clientSocket = serverSocket.accept() // 接受客户端连接
listener?.onClientConnected(clientSocket) // 通知客户端已连接
val clientThread = ClientHandler(clientSocket, listener) // 为每个客户端创建一个新的线程
clientThread.start()
clientHandlers.add(clientThread) // 安全地添加 Handler 到列表
}
} catch (e: Exception) {
listener?.onError(e)
}
}
// 关闭服务器的方法
fun stopServer() {
clientHandlers.forEach {
it.closeConnection() } // 关闭所有客户端线程
try {
serverSocket.close() // 关闭 ServerSocket
} catch (e: Exception) {
e.printStackTrace()
}
}
// 当线程被中断时,关闭服务器
override fun interrupt() {
stopServer()
super.interrupt()
}
// 定义处理每个客户端连接的线程
class ClientHandler(private val socket: Socket, private val listener: SocketServerListener? = null) : Thread