socket和websocket的区别

116 阅读2分钟

先上图,socket是在哪层

websocket是应用层,和http同层,websocket是用http升级而来的。

图片.png

通过如下golang,js代码就可以得到一个简易的websocket通信,服务端,和客户端就可以进行通信啦。

package main  
 
import (  
   "github.com/gin-gonic/gin"  
   "github.com/gorilla/websocket" 
   "net/http"
)  
 
 
var upGrader = websocket.Upgrader{  
   CheckOrigin: func (r *http.Request) bool {  
      return true  
   },  
}  
 
//webSocket请求ping 返回pong  
func ping(c *gin.Context) {  
   //升级get请求为webSocket协议
   ws, err := upGrader.Upgrade(c.Writer, c.Request, nil)  
   if err != nil {  
      return  
   }  
   defer ws.Close()  
   for {
      //读取ws中的数据  
      mt, message, err := ws.ReadMessage()
      //断开连接
      if err != nil {  
         break  
      }  
      if string(message) == "ping" {  
         message = []byte("pong")  
      }  
      //写入ws数据
      err = ws.WriteMessage(mt, message)  
      if err != nil {  
         break  
      }  
   }  
}  
 
func main() {  
   bindAddress := "10.0.2.18:2303"  
   r := gin.Default()  
   r.GET("/ping", ping)  
   r.Run(bindAddress)  
}
<html>
<head>
<title>test</title>
</head>
<body>
test ....
</body>
<script>
var ws = new WebSocket("ws://10.0.2.18:2303/ping");  
//连接打开时触发 
ws.onopen = function(evt) {  
    console.log("Connection open ...");  
    ws.send("Hello WebSockets!");  
};  
//接收到消息时触发  
ws.onmessage = function(evt) {  
    console.log("Received Message: " + evt.data);  
};  
//连接关闭时触发  
ws.onclose = function(evt) {  
    console.log("Connection closed.");  
};  
</script>
</body>

接下来说一下不同点
首先来和http比较一下
Http连接:http连接就是所谓的短连接,及客户端向服务器发送一次请求,服务器端相应后连接即会断掉。
Socket:是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口,通过Socket,我们才能使用TCP/IP协议。
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

1。服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

2。客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

3。连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
4。而http,连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

websocket则是全双工通信,双方都可以相互发消息

WebSocket连接的过程是:

首先,客户端发起http请求,经过3次握手后,建立起TCP连接;http请求里存放WebSocket支持的版本号等信息,如:Upgrade、Connection、WebSocket-Version等; 然后,服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据; 最后,客户端收到连接成功的消息后,开始借助于TCP传输信道进行全双工通信