新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
socket代理又分为socket4和sockt5代理,其中socket4只能支持TCP协议,而socket5则同时支持TCP协议和UDP协议。
创新互联建站主要从事成都网站设计、成都做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务琼结,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
Socket通信的原理还是比较简单的, 它大致分为以下几个步骤。 服务器端的步骤如下。 (1)建立服务器端的Socket,开始侦听整个网络中的连接请求。 (2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的...
为每个client fd开两个goroutine,一个recv,一个send。同时还有加2个channel,一个用于recv routine向逻辑主线程传送收到的数据,一个用于逻辑主线程向send goroutine传送待发送的数据,是这样的么?
实际上需要 3 个 goroutine,一个 read,一个 send,还有一个 handle。
read goroutine 读,然后写入 recevice chan。
write goroutine 把 send chan 的东西写。
handle goroutine 是 conn 的主要处理逻辑,负责把 recevice chan 的东西读出来 call 业务逻辑。
业务逻辑中要写数据就直接写入 send chan。
这样就可以保证,业务逻辑的读写都是在 handle goroutine 上处理,而避免 race 产生。
如果需要定时任务(比如心跳),就在 handle goroutine 上加上一个 timer.C;
如果需要 goroutine 下发任务,在 handle goroutine 增加一个 task chan,hanlde 收到 task 后处理业务;
如果需要输出结果,那就增加 result chan,业务逻辑把数据输出即可。
----------------------------
还有,如果我开2个goroutine的话,client断开连接了,假设recv goroutine先发生err并且close(fd),那在send goroutine中该如何处理呢?有可能不应该这样处理,那应该怎么处理呢?
如果 net.Conn Close() 了,不论 Read() 阻塞还是 Write() 阻塞都会立即收到 err 返回。
一般来说,Write() 是不可能主动知道连接断开的,除非是 SetDeadline() 猜测对方断掉了,指定时间内没有写成功就认为是断开。Read() 是可以主动收到对方发来的断开(TCP FIN),但也没办法知道异常的断开(当然也可以设置超时)。
无论是谁,是确实收到 FIN 还是 Deadline 猜测断开,只要 Close() 大家就知道连接断开了。
handle goroutine 还有一个用处就是:你的程序主动结束的时候,能正确的 close conn,让对方知道你是真的断开了,而不用去猜。