在安卓应用中实现Socket通信:创建服务端和客户端

介绍:本文主要介绍在安卓中使用Socket创建服务端和客户端进行通信,服务端可以管理多个客户端连接,完善的异常处理,接口回调,可以满足大部分需求,更多功能自行拓展…

关于Socket套接字:

是网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。

使用Socket进行网络通讯的一般步骤如下:

  1. 创建Socket对象,指定服务器的IP地址和端口号。
  2. 使用Socket对象的getInputStream()和getOutputStream()方法获取输入输出流,用于接收和发送数据。
  3. 使用输出流发送请求到服务器,使用输入流读取服务器返回的数据。
  4. 使用完毕后,通过调用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值