go语言网络编程socket client实现
之前我们写过sever的实现,今天写一下client的实现,这里面我写的代码都是最简单的实现方式,也就是基本上提供一个思路,大家如果工作中遇到了,需要随机应变,活学活用。
先看实例代码:
package main import ( "fmt" "io" "net" ) func main() { addr := "127.0.0.1:8080" conn, err := net.Dial("tcp", addr) if err != nil { fmt.Println(err.Error()) return } defer conn.Close() _, err = conn.Write([]byte("hello world")) if err != nil { fmt.Println(err.Error()) return } buf := make([]byte, 1024) n, err := conn.Read(buf) if err != nil && err != io.EOF { //io.EOF 判断连接关闭 fmt.Println(err.Error()) return } fmt.Println(string(buf[:n])) }
这是一个非常简单的client,首先我们使用
net.Dial()
这个接口去拨号,成功后我们可以得到一个Conn的对象,也就是与sever端的一个连接,然后使用Write接口发送数据,sever接收到之后,我们再使用Read接口获取sever返回的数据。
说实话,这个是简单的不能再简单的client了。与我们之前写的sever可以一起使用,但是项目中用的时就不是这么简单了,我们通常要处理并发,而且有时还需要用队列,所以我们就要对上面的代码修改一下,这里我说一下大体的思路,代码就不在这里演示了,如果大家想看代码,可以私信或者评论。
首先我们先创建一个client的结构体,当有一个新的请求时,如果当前没有cliet对象就创建一个,同时去连接你想要的sever,并且同时创建一个协程,这个协程里面用来等待sever的返回,每当有一个请求有返回时,这个协程就把返回数据读出来,同时可以再次创建一个协程,用来将这个返回的数据再返回给client。
对于我们发送请求时,我们需要使用两个channel,一个是等待上面说的处理sever返回数据的协程来返回具体的数据,另外一个是用来返回错误,同时我们需要有一个超时时间,这里我们可以使用:
func After(d Duration) <-chan Time
这个方法,这样我们就可以使用select语句来处理,同时等待接收三个channel,一个是sever返回的数据,一个是error,另外一个就是超时时间。
这样我们的效率就会大大提升,多说一句,go的协程是比较好用的,大家使用的时候可以多去使用,而且比较方便。
我的文章目前都是比较基础的内容,对于初学者来说还算是比较友好的,当然对于有经验的开发者来说,这都是最基础的,我个人认为,编程中又很多东西是相通的,但是对于不同的项目需求来说,也是千差万别的。我之所以写的都这么简单,是因为我觉得只要掌握了这个基础了思路,再根据实际情况拓展就更加轻松了。所以我这里还是想给初学者一个建议,无论学习什么,基础是非常重要的,一步一个脚印。
当然以后我也会写一些深入的东西,但是由于工作的原因,文章量可能不多,还望大家谅解。
后续会有更多的模式和算法以及区块链相关的,如果你是想学习go语言或者是对设计模式或者算法感兴趣亦或是区块链开发工作者,都可以关注一下。(微信公众号:Go语言之美,更多go语言知识信息等)。公众号会持续为大家分享更多干货。