websocket:如何建立在同一台client和同一台server创建多个连接
来源:互联网 发布:淘宝名字怎么改昵称 编辑:程序博客网 时间:2024/05/16 07:16
最近一直纠结到底能不能在同一台服务器上和同一个客户端建立多个通讯连接,经过查阅大量的网页资料+亲自实践证明确实可以这样做,但是他们如何通讯?下面是相关代码:
Server.go 。。。。。。。。。。。。。。。。。。。。。。。。
package main import ( "flag" "fmt" "log" "net/http" "github.com/gorilla/websocket" "tttest/pubvisit" "tttest/pubvisit/MapTable" ) var upgrader = websocket.Upgrader{ ReadBufferSize: 4096, WriteBufferSize: 4096, } func main() { var addr = flag.String("addr", ":8000", "http service address") http.HandleFunc("/Connection", Connection) fmt.Println("Test Server Start...") err := http.ListenAndServe(*addr, nil) if err != nil { log.Fatal("ListenAndServe: ", err) } } func Connection(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println("Upgrade:", err) } defer conn.Close() for { info := pubvisit.ReadFromMsg(conn) MapTable.SaveConn(conn, info.Name) switch info.Name { case "Jhon": var jres pubvisit.Message jres.Name = info.Name jres.Phone = info.Phone jres.Prompt = info.Name + " comeback..." pubvisit.WriteReturnMsg(jres, conn) default: var ores pubvisit.Message ores.Name = info.Name ores.Phone = info.Phone ores.Prompt = info.Name + " comeback..." pubvisit.WriteReturnMsg(ores, conn) } } }
Client.go 。。。。。。。。。。。。。。。。。。。。。。。。
package mainimport ( "bufio" "fmt" "log" "os" "strings" "time" "tttest/pubvisit" "tttest/pubvisit/MapTable" "github.com/gorilla/websocket")var visitAddr = "ws://127.0.0.1:8000/Connection"func main() { conn, _, err := websocket.DefaultDialer.Dial(visitAddr, nil) if err != nil { log.Fatal("dial:", err) } defer conn.Close() MapTable.SaveConn(conn, "init") //保存创建的连接 pubvisit.InitData(conn) //发一个初始化包 go ClientWriterToSer()//开启一个goroutine提供写命令 for { time.Sleep(1 * time.Second) for key, rconn := range MapTable.ConnManage { go func() { //goroutine 这里是第2条conn的监听处理 if !strings.EqualFold(key, "init") { info2 := pubvisit.ReadFromMsg(rconn.Conn) fmt.Println(info2.Prompt, " & Phonenumber is ", info2.Phone) } }() } // 下面是第1条conn的监听处理,会一直监听,这里不中断 fmt.Println("\n") info := pubvisit.ReadFromMsg(conn) fmt.Println(info.Prompt, " & Phonenumber is ", info.Phone) fmt.Println("\n") }}func ClientWriterToSer() { for { conn, _, err := websocket.DefaultDialer.Dial(visitAddr, nil) if err != nil { log.Fatal("dial:", err) } defer conn.Close() MapTable.SaveConn(conn, "other") var info pubvisit.Message reader := bufio.NewReader(os.Stdin) data, _, _ := reader.ReadLine() reader2 := bufio.NewReader(os.Stdin) data2, _, _ := reader2.ReadLine() info.Name = string(data) info.Phone = string(data2) pubvisit.WriteReturnMsg(info, conn) fmt.Println("") //在请求和响应之间加1个空格 }}
tttest/pubvisit.go 。。。。。。。。。。。。。。。。。。。。。。。。
package pubvisitimport ( "encoding/json" "fmt" "log" "tttest/pubvisit/HostInfo" "github.com/gorilla/websocket")type Message struct { Name string `json:"name"` Phone string `json:"phone"` HostName string `json:"hostname"` Prompt string `json:"prompt"`}func ReadFromMsg(Reconn *websocket.Conn) Message { _, SerMsg, err := Reconn.ReadMessage() if err != nil { log.Println("read:", err) } var info Message err = json.Unmarshal(SerMsg, &info) if err != nil { log.Println(err) } return info}func WriteReturnMsg(sbuf Message, conn *websocket.Conn) { buffer, err := json.Marshal(sbuf) if err != nil { fmt.Println("error:", err) } err = conn.WriteMessage(websocket.TextMessage, buffer) if err != nil { fmt.Println("WriteMessage :", err) }}func InitData(conn *websocket.Conn) { name := "Jhon" phone := "132132132132132" hostname, _ := HostInfo.GetPcNameAndPcMac() var msg Message msg.Name = name msg.Phone = phone msg.HostName = hostname WriteReturnMsg(msg, conn)}
tttest/pubvisit/MapTable.go 。。。。。。。。。。。。。。。。。。。。。。。。
package MapTableimport ( "github.com/gorilla/websocket")type Client struct { Conn *websocket.Conn}var ConnManage = make(map[string]*Client)func SaveConn(conn *websocket.Conn, subkey string) { var cli Client cli.Conn = conn ConnManage[subkey] = &cli}
tttest/pubvisit/HostInfo.go 。。。。。。。。。。。。。。。。。。。。。。。。
package HostInfoimport ( "log" "net" "os")func GetPcNameAndPcMac() (HostName, HostMac string) { //获取本机主机名 host, err := os.Hostname() if err != nil { log.Println(err) } else { HostName = host } // 获取本机的MAC地址 interfaces, err := net.Interfaces() if err != nil { panic("Poor soul, here is what you got: " + err.Error()) } for _, inter := range interfaces { // linux 环境下,第一个Mac接口为空,在此过滤,只取最优的 if inter.HardwareAddr.String() != "" { macAddr := inter.HardwareAddr.String() //获取本机MAC地址 HostMac = macAddr //fmt.Println("HostMac : ", HostMac) break } } return HostName, HostMac}
1)编译执行server端代码
2)开始编译执行client端代码
3)client执行效果图
11> 建立第一条连接:
“Jhon comeback… & Phonenumber is 132132132132132”是初始化后server返回的”
22> 建立第二条连接:
“hello comeback… & Phonenumber is 13713713737137”是输入“hello 13713713737137 ”的返回
谨以此记录一下这个的坑
阅读全文
1 0
- websocket:如何建立在同一台client和同一台server创建多个连接
- 如何在同一台Server上启动多个JBOSS
- 如何在同一台服务器上绑定多个域名?
- Git之同一台电脑连接多个远程仓库
- Git之同一台电脑连接多个远程仓库
- 同一台机器如何同时使用多个Git账号
- 同一台机器如何同时使用多个Git账号
- 在同一台机器上运行多个服务器
- 在同一台机器上运行多个 MySQL 服务
- 在同一台机器上运行多个MySQL服务器
- 在同一台机器上运行多个MySQL服务器
- 在同一台机器上运行多个Resin实例
- 在同一台电脑上启动多个tomcat服务器
- 在同一台机器上运行多个MySQL服务器
- 在同一台服务器上配置多个Tomcat
- 在同一台服务器上配置多个Tomcat
- 在同一台机器上运行多个Resin实例
- 在同一台服务器上配置多个Tomcat
- zabbix服务器端部署 for CentOS7
- 自定义权限模块2——自定义tld标签
- 电子设计竞赛指导总结
- Hibernate学习笔记(一)
- stm32成长记之LED呼吸灯
- websocket:如何建立在同一台client和同一台server创建多个连接
- Bellman_ford 求最短路模板
- 工作中小细节总结(三)
- Spring AOP---切面编程基础(动态代理)
- MySQL学习笔记——20170811
- Codeforces Round #428 (Div. 2) Game of the Rows (思维)
- Java基础总结-基本语法概念-1
- LeetCode: 66. Plus One
- C/C++指针错误与调试相关学习总结