服务之Socket及Websocket介绍

        现在我们编写Web应用或者基于RPC应用,其实说白了,都是基于socket的编程。本文就是记录一下自己直接用Go的net包基于底层socket进行实践,编写了服务端和客户端。服务端采用协程,即启动多个goroutine,思想其实和net/http包里面的Server一致:对于每一个新的客户端连接,都会新开一个goroutine,而不影响其他的连接。

        上代码吧:

Server:



func handleconn(conn net.Conn) {
	//defer conn.Close()
	fmt.Println(conn.RemoteAddr().String())
	ch := make(chan bool)
	//rch := make(chan bool)
	//读取客户端传送的消息
	go func() {

		fmt.Println("enter go func")
		now := time.Now().String()
		conn.Write([]byte(now))
		fmt.Println("func write complete")
		ch <- true
	}()
	<- ch
	go func() {
		buf := make([]byte, 4)
		n, _ := conn.Read(buf)
		fmt.Println(buf[:n])
		fmt.Println("func read complete")
		ch <- true
	}()
	<- ch
   fmt.Println("read and write finished both")
   }



func main() {
	socket,err := net.Listen("tcp",":8000")
	if err != nil {
		fmt.Println(err)
	}
	for {
		conn,err := socket.Accept()
		if err != nil {
			fmt.Println(err)
			continue
		}
		go handleconn(conn)
	}
}

上述服务端代码已经写了注释,解释了基本设计逻辑。

CLIENT:

package main

import (
	"fmt"
	"net"
	"io/ioutil"
	"os"
)

func CheckError(err error) {
	if err != nil{
		fmt.Println("err:",err)
		os.Exit(1)
	}
}

func main() {
	sockaddr,err := net.ResolveTCPAddr("tcp4","localhost:8000")
	CheckError(err)
   //dial tcp,请求建立和目标服务器的Socket连接。
	conn,err := net.DialTCP("tcp",nil,sockaddr)
	CheckError(err)
    //读取服务器通过已经建立的连接通道发送的数据,读出的是字节流数据
	result,err := ioutil.ReadAll(conn)
    //将byte转换为字符串
	fmt.Println("from server message:",string(result))
	os.Exit(0)
}

基本的业务逻辑还是挺简单的,具体的一些业务逻辑可以在这个基础上进行添加。

补充一点:尽量不要用ioutil.ReadAll,该方法是要等到err或者EOF才会返回结果,即一直阻塞,今天做的可把我坑惨了。可以用buf:

buf := make([]byte,1024)
		n, _ := conn.Read(buf)
		fmt.Println(buf[:n])

 

Websocket介绍

目前,在socket基础上衍生出了一个WebSocket,其基本思想是每一个Web客户端和服务器建立一个TCP连接,所有的数据通信都走这一个连接通道。

它的出现主要是解决什么问题呢?

我们都知道,对于普通的Web,都是采用HTTP协议,如果我们希望能够实现及时通信,就需要客户端不断地向服务器发送HTTP请求,你有没有新数据,有没有数据,有没有数据。这种经常性地发送HTTP请求势必造成了资源带宽的浪费。而且这也会造成同步的延迟。

上面的问题,通过WebSocket就可以解决。有了Websocket,那客户端和服务端建立了唯一的连接,然后服务端会主动把消息发给服务端。即你建立好之后,客户端就是少女,服务端就是个饥渴男,我有消息,我有消息,我有消息,而不用客户端自己再主动询问。

当然,Websocket同样也需要先进行一次HTTP连接,然后再使用WebSocket进行通信。

具体的实现可以参考一篇文章:Websocket实现

更好的介绍文章:Socket与WebSocket

 

--------EOF---------
本文微信分享/扫码阅读