在一些大厂中,为了使网络操作比较灵活的,通常会采用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() } } }
这样做虽然比较笨,但是用来很好用,也解决了连接成功无监听的问题了。
就先写到这里吧,之后有什么问题,会及时更新的、
网友评论