基于go语言的websocket建立

服务器

package main

import (
	"bufio"
	"fmt"
	"net/http"
	"os"

	//"time"

	"github.com/gorilla/websocket"
)

var (
	up = websocket.Upgrader{
		// 检查区域 可以自行设置是POST 或者GET请求 还有URL等信息 这里直接设置表示都接受
		CheckOrigin: func(r *http.Request) bool {
			return true
		},
	}
) //升级器函数

func httphandle(resp http.ResponseWriter, req *http.Request) {
	//升级为websocket
	var conn *websocket.Conn
	var err error
	conn, err = up.Upgrade(resp, req, nil)
	if err != nil {
		fmt.Println("upgrede failed")
		return
	} else {
		fmt.Println("now is websocket")
	}
	//开启写协程
	go func() {
		for {
			r, _ := bufio.NewReader(os.Stdin).ReadString('\n')
			if err := conn.WriteMessage(websocket.TextMessage, []byte(r)); err != nil {
				return
			}
			//time.Sleep(1 * time.Second)
		}
	}()
	//读协程
	for {

		_, data, err := conn.ReadMessage()
		if err != nil {
			goto ERR
		} else {
			fmt.Println(string(data))
		}
	}

ERR:
	conn.Close()
}

//ResponseWriter 发送给客户端的响应信息
//http.Request 客户端请求体

func main() {
	/*服务器启动程序*/
	//开启http服务
	http.HandleFunc("/", httphandle)
	/*第一个参数指的是请求路径,第二个参数是一个函数类型,表示这个请求需要处理的事情
	第二个参数为一个接口 接口具有ServeHTTP(w http.ResponseWriter, r *http.Request)函数*/

	//监听服务
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		fmt.Println("ListenAndServe: ", err)
	}

}

客户端:

<!DOCTYPE html>
<html>
<head>
	<title>go websocket</title>
	<meta charset="utf-8" />  
</head>
<body>
	<script type="text/javascript">
		var wsUri ="ws://127.0.0.1:8080/ws"; 
	    var output;  
	    
	    function init() { 
	        output = document.getElementById("output"); 
	        testWebSocket(); 
	    }  
	 
	    function testWebSocket() { 
	        websocket = new WebSocket(wsUri); 
	        websocket.onopen = function(evt) { 
	            onOpen(evt) 
	        }; 
	        websocket.onclose = function(evt) { 
	            onClose(evt) 
	        }; 
	        websocket.onmessage = function(evt) { 
	            onMessage(evt) 
	        }; 
	        websocket.onerror = function(evt) { 
	            onError(evt) 
	        }; 
	    }  
	 
	    function onOpen(evt) { 
	        writeToScreen("CONNECTED"); 
	       // doSend("WebSocket rocks"); 
	    }  
	 
	    function onClose(evt) { 
	        writeToScreen("DISCONNECTED"); 
	    }  
	 
	    function onMessage(evt) { 
	        writeToScreen('<span style="color: blue;">RESPONSE: '+ evt.data+'</span>'); 
	       // websocket.close(); 
	    }  
	 
	    function onError(evt) { 
	        writeToScreen('<span style="color: red;">ERROR:</span> '+ evt.data); 
	    }  
	 
	    function doSend(message) { 
	        writeToScreen("SENT: " + message);  
	        websocket.send(message); 
	    }  
	 
	    function writeToScreen(message) { 
	        var pre = document.createElement("p"); 
	        pre.style.wordWrap = "break-word"; 
	        pre.innerHTML = message; 
	        output.appendChild(pre); 
	    }  
	 
	    window.addEventListener("load", init, false);  
	    function sendBtnClick(){
	    	var msg = document.getElementById("input").value;
	    	doSend(msg);
	    	document.getElementById("input").value = '';
	    }
	    function closeBtnClick(){
	    	websocket.close(); 
	    }
	</script>
	<h2>WebSocket Test</h2>  
	<input type="text" id="input"></input>
	<button onclick="sendBtnClick()" >send</button>
	<button onclick="closeBtnClick()" >close</button>
	<div id="output"></div> 	
	
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值