kotlin进程通信------socket(代码片段)

战国剑 战国剑     2022-11-16     405

关键词:

Socket作为进程通信的一种方式,在日常的进程通信中使用的不频繁,它更常用的是即时通讯、跨设备的一对多场景等。android进程间通信中使用socket,一般是一对一的场景,是常用Socket方式的降级、简单化的使用方式。

Socket的使用,需要了解、注意的是它的握手、挥手机制。

简洁明了的,可以参考:

为什么不能用两次握手进行连接?

为什么socket是三次握手挥手却是四次

详细解释的,可以参考:HTTP、HTTPS、TCP/IP、Socket通信、三次握手四次挥手过程?

回到android socket进程通信场景。我们要做的还是和前几篇类似,做一个简易工程,来实现通信:这里需要一个client(socket)客户端、一个server(socket server)服务端。

一、server(socket server)服务端

如下代码:我们定义了一个Service形式的服务端:

1、在此处我们没有使用onBind了;

2、新开线程,开启ServerSocket,监听9999这个端口,等待客户端的连接请求;

3、accept是阻塞式的,需要在线程中等待;

4、readLine方式获取客户端数据。当客户端关闭后,客户端会发过来的数据null。所以有这么一个判空跳出,关闭服务;


class SocketServer : Service() 

    var serverAllowed :Boolean = true

    private var runnable = Runnable 
        val serverSocket:ServerSocket = ServerSocket(9999)
        val accept:Socket = serverSocket.accept()
        Thread  response(accept) .start()
    

    override fun onCreate() 
        super.onCreate()
        Thread(runnable).start()
    
    override fun onBind(intent: Intent?): IBinder? 
        TODO("Not yet implemented")
    

    private fun response(accept: Socket) 
        try 
            //从客户端接收的信息
            val bufferedReaderIn: BufferedReader = BufferedReader(InputStreamReader(accept.getInputStream()))
            //发送信息给客户端
            val out:PrintWriter = PrintWriter(BufferedWriter(OutputStreamWriter(accept.getOutputStream())),true)
            while (serverAllowed)
                val msg = bufferedReaderIn.readLine()
                if(TextUtils.isEmpty(msg))
                    println("收到客户端的信息为空,断开连接")
                    break
                
                println("收到客户端的信息: $msg")
                val msgOp = "加工从客户端的信息: $msg"
                out.println(msgOp);
            
            println("关闭服务")
            bufferedReaderIn.close()
            out.close()
            accept.close()

        catch (e:Exception)
            println(e.message)
        

    

    override fun onDestroy() 
        super.onDestroy()
        serverAllowed = false
    

服务写好后,只要启动该服务就可以:

 startService(Intent(this, SocketServer::class.java))

二、client(socket)客户端

如下代码,如果省略异常处理的话,可以用一句话概括下:新建socket对象,在socket对象基础上,新建发送和接收对象,操作发送和接收对象做相应的操作。

此处,我们做的操作是,每1秒向服务端发送和接收数据。

注意:以下代码需要在线程中调用,因为readLine也是阻塞的方法。

private fun connectSocketServer() 
        var read: BufferedReader? = null
        var write: PrintWriter? = null
        var socket: Socket? = null
        try 
            if (socket == null) 
                socket = Socket("localhost", 9999)
            
            while (!isFinishing()) 
                //1、发送数据
                if (write == null) 
                    write = PrintWriter(
                        BufferedWriter(OutputStreamWriter(socket.getOutputStream())),
                        true
                    ) //发送数据
                
                write.println("客户端发出信息")

                //2、 接收服务器端的消息
                if (read == null) 
                    read = BufferedReader(InputStreamReader(socket.getInputStream()))
                
                val msg: String = read.readLine()
                println("客户端接收信息:$msg")
                SystemClock.sleep(1000)
            
            println("客户端关闭")
         catch (e: Exception) 
           println(e.message)
         finally 
            read?.close()
            write?.close()
            socket?.close()
        
    

最后,还是要加上权限与service声明。

<service
            android:name=".socket.SocketServer"
            android:label="@string/socket_name"
            android:process=":socket_remote">
        </service>
<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

原理通过工程可以体现,如果需要真实在线上运行,还需要做优化:socket的稳定性、开启关闭时机等。以上仅供参考。

kotlin进程通信------socket(代码片段)

Socket作为进程通信的一种方式,在日常的进程通信中使用的不频繁,它更常用的是即时通讯、跨设备的一对多场景等。android进程间通信中使用socket,一般是一对一的场景,是常用Socket方式的降级、简单化的使用方... 查看详情

kotlin进程通信------messenger(代码片段)

...ttps://zhuanlan.zhihu.com/p/35519585本文主要介绍应用层上如何用Kotlin来使用Messenger进行进程通讯。Messenger是对底层Binder进行封装后的一套系统框架,在进程间通讯的表现是串行通讯。假设有进程A和进程B。如果要进行多次数据通讯&#... 查看详情

kotlin进程通信------messenger(代码片段)

...ttps://zhuanlan.zhihu.com/p/35519585本文主要介绍应用层上如何用Kotlin来使用Messenger进行进程通讯。Messenger是对底层Binder进行封装后的一套系统框架,在进程间通讯的表现是串行通讯。假设有进程A和进程B。如果要进行多次数据通讯&#... 查看详情

kotlin简单实现aidl进程间通信(代码片段)

上一篇:java简单实现AIDL进程通信,是java版的,现在写一篇kotlin的。具体步骤和上篇文章一样,我直接贴代码。服务端NameServiceclassNameService:Service()overridefunonBind(intent:Intent):IBinder?returnServiceStub()classServic 查看详情

kotlin简单实现aidl进程间通信(代码片段)

上一篇:java简单实现AIDL进程通信,是java版的,现在写一篇kotlin的。具体步骤和上篇文章一样,我直接贴代码。服务端NameServiceclassNameService:Service()overridefunonBind(intent:Intent):IBinder?returnServiceStub()classServic 查看详情

kotlin进程通信------aidl(代码片段)

前篇介绍了进程通信中,串行通信的方式Messenger。但如果进程间,有多个方法要并行调用,那么Messenger就不合适使用,而应该使用AIDL方式。Java方式的AIDL,在之前的文章中有介绍:Android远程接口之AIDL——P... 查看详情

socket简介(代码片段)

 socket简介1.不同电脑上的进程之间如何通信首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在1台电脑上可以通过进程号(PID)来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解... 查看详情

socket简介(代码片段)

1.不同电脑上的进程之间如何通信首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在1台电脑上可以通过进程号(PID)来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题... 查看详情

socket原理(代码片段)

...立、数据传输等操作都是通过该Socket实现的。2、网络中进程如何通信既然Socket主要是用来解决网络通信的,那么我们就来理解网络中进程是如何通信的。2.1、本地进程间通信a、消息传递(管道、消息队列、FIFO)  b、同步(... 查看详情

socket编程(代码片段)

一、什么是socketsocket(简称 套接字)是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于Socket来完成通信的例如我们每天浏览网页、Q... 查看详情

kotlin进程通信------messenger(代码片段)

...ttps://zhuanlan.zhihu.com/p/35519585本文主要介绍应用层上如何用Kotlin来使用Messenger进行进程通讯。Messenger是对底层Binder进行封装后的一套系统框架,在进程间通讯的表现是串行通讯。假设有进程A和进程B。如果要进行多次数据通讯&#... 查看详情

socket通信简介(代码片段)

...开源项目研究。我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你 查看详情

超详细的socket通信原理和实例讲解(代码片段)

我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都... 查看详情

kotlin进程通信------aidl(代码片段)

...le、in、out、inout简例此处,主要将前文中的Java方式用Kotlin方式翻译。AIDL方式通信,在Kotlin中遵循和Java中同样的规则,包括数据结构的限制,AIDL文件的编写。一、AIDL文件编写AIDL文件的编写,有特定的要求如... 查看详情

socket编程初识(代码片段)

...个模块,通过import导入,通过调用模块中的方法建立两个进程之间的连接和通信。Socket是应用层与传输层通信的中间软件抽象层,它是一组接口。它是为了帮我们简化两个进程之间通信的步骤,使用Socket不需要我们很了解网络层... 查看详情

unix进程小结进程间通信方式总结(代码片段)

进程间通信(IPC)介绍进程间通信(IPC,InterProcessCommunication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和Streams支持不同... 查看详情

超详细的socket通信原理和实例讲解(代码片段)

我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都... 查看详情

socket通信简介(代码片段)

...开源项目研究。我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程... 查看详情