1socket编程概述
什么是socket编程?socket编程是计算机PC机器上2个程序通过一个双向的通信连接实现数据的交互,这个连接的一端就是一个socket。socket的翻译意思上还有个插座的概念,其实,也可以很形象的比喻为插座插上去了就有通电了(网络通了)。
socket编程其实作为UNIX系统的进程间通信机制,通常称为“套接字”,用来描述IP地址和端口的集合,在unix系统下是一个通信的句柄(文件描述符,因为UNIX下所有都是文件)。
UNIXsocket编程的流程大概如下:
服务端:socket(),bind(),listen(),accept(),read()/write(),close()
服务端:socket(),connect(),read()/write(),close()
2Go语言socket编程库
go语言的基础包中,网络包net包含了很多网络I/O,TCP/IP,UDP,域名解析,Unix域套接字等。
虽然提供的都是直接面对很底层的网络I/O访问,但是主要的TCP通信的接口也是封装得比较简单,好用,包括有:
客户端连接使用的Dial方法
服务端进行监听使用的Listen方法
服务端进行接受链接的Accept方法
封装了连接对象Conn类型
3Go语言socket例子与运行结果
3.1源码例子
客户端:客户端连接上服务端后,等待接收数据(使用ReadAll进行全部读取),然后打印出来。
goclientcode服务端:服务端在端口进行监听,并等待客户端连接,来一个连接就给这个客户单发送HelloWorld加上当前时间的字符串,然后关闭连接。服务端是个循环。
goservercode3.2运行结果
客户端
clientrequest服务端
serverresponse4Go语言socket实际应用
虽然go的socket编程基础方法基本上实现了整个网络socket通信的原型,并且也有最基础的方法库,但是要想写出符合工作中的实际可用的,高并发,高可用的服务,还是需要结合routine和channel的特性基础上进行一定的服务编程模型设计,如以下服务模型和I/O模型的结合:
I/O多路复用管道通信异步调研线程池(routine池)worker线程
并且在工作中往往结合google的protocolbuffer进行字节序列化之后的结合进行底层的socket通信。
底层的socket通信应用场景往往在这些业务领域:
app和前端的h5要做实时通知机制(websocket)
app的心跳存活检测
客户端对网络流量非常在乎(4G)网络,底层socket通信可以控制协议的精简可靠