关于Android的Socket编程

在一些大厂中,为了使网络操作比较灵活的,通常会采用Socket编程,我也是如此,目前公司要求使用socket进行简单的请求协议的封装和socket的一些基本使用,我在这里分享一下心得。

首先,我们需要了解一下socket是什么东西。Socket中文名字套接字是属于网络请求中比较底层的操作,利用socket发送请求都是直接操作流数据(inputSteam,outputSteam)。说白了就是比较底层,连请求协议都没有封装的一种前后端交互方式。

那么了解了Socket是什么之后,接下来我来说一下客户端对于Socket的使用流程:

step 1.创建Socket实例

step 2.判断是否连接成功

step 3.获取输出流(outputSteam)

step 4.获取输入流(inputSteam)

step 5.释放资源

上面的步骤执行完之后,就完成了一个简单的网络请求的操作了,下面我直接用代码来实现上面的步骤(例子用kotlin来实现):

val socket = Socket("www.baidu.com",80)

if (socket.isConnected) {

    val butterWriter= BufferedWriter(OutputStreamWriter(socket.getOutputStream()))        bufferWriter.write("需要发送到目标主机的内容")                                                bufferWriter.flush()                                                                                                          val bufferedReader  = BufferedReader(InputStreamReader(socket.getInputStream()))                                         //这里开始读取信息流 就不过多的写了

    //最后记得释放资源

    socket.close()

}

上面这种是最简的写法,但是会发现一个问题,首先socket的连接是耗时的,如果不在同一个线程中操作,很可能会出现if中的代码不执行,原因就是socket咩有初始化完成,但是我查看socket的文档发现socket好像并没有类似的回调,所以我自己用笨方法写了一个:

fun setConnectedListener(listener: () -> Unit) {                    GlobalScope.launch(Dispatchers.IO) {                                                                            while (socket?.isConnected == false) { }                                                  withContext(Dispatchers.Main) {                                                                            listener.invoke()                                                                                                          }                                                                                                                                 }                                                                                                                                    }

这样做虽然比较笨,但是用来很好用,也解决了连接成功无监听的问题了。

就先写到这里吧,之后有什么问题,会及时更新的、

你可能感兴趣的:(关于Android的Socket编程)