全新的。。显然还在学习语法和基础知识。。但我心里确实有一个明确的目标。。
我试图只是得到一个简单的服务器上: 8080,可以响应HTTP和socket.io(通过/socket.io/
url),特别是与CORS。
我的代码:
package main
import (
"log"
"net/http"
"github.com/rs/cors"
"github.com/googollee/go-socket.io"
)
func SayHelloWorld(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, World!"))
}
func main() {
c := cors.New(cors.Options{
AllowedOrigins: []string{"*"},
AllowCredentials: true,
})
server, err := socketio.NewServer(nil)
if err != nil {
log.Fatal(err)
}
server.On("connection", func(so socketio.Socket) {
log.Println("on connection")
so.Join("chat")
so.On("chat message", func(msg string) {
log.Println("emit:", so.Emit("chat message", msg))
so.BroadcastTo("chat", "chat message", msg)
})
so.On("disconnection", func() {
log.Println("on disconnect")
})
})
server.On("error", func(so socketio.Socket, err error) {
log.Println("error:", err)
})
http.Handle("/socket.io/", c.Handler(server))
http.HandleFunc("/", SayHelloWorld)
log.Println("Serving at localhost:8080...")
log.Fatal(http.ListenAndServe(":8080", nil))
}
在客户端,我仍然看到:
WebSocket连接到'wss://api.domain.com/socket.io/?EIO=3
(索引):无法加载1 XMLHttpRequesthttps://api.domain.com/socket.io/?EIO=3
编辑#1:
所以我一直在绞尽脑汁想弄明白为什么我无法连接。。遇到了一个更令人困惑的难题?
https://gist.github.com/acoyfellow/167b055da85248c94fc4
以上要点是我Go语言服务器的代码浏览器用来连接的代码。这段代码将每秒向后端发送30个HTTP GET请求,而不会连接、升级或给出任何错误(客户端或服务器端)...
有人,请有人告诉我我在做蠢事。。这真是一道难题:P
编辑#2:
我可以通过简单地调整Go中socket.ioendpoint的URL上的尾随/
来停止"DDOS"。所以:mux。处理("/socket.io",服务器)
到mux。句柄("/socket.io/",服务器)
现在将产生错误消息和连接尝试,错误响应为:
WebSocket连接到'wss://api.domain.com/socket.io/?EIO=3
收到https://api.domain.com/socket.io/?EIO=3
CORS似乎不适用于WebSocket。根据WebSocket的“这个相关问题”,有一个“origin”标题,浏览器必须用包含打开WS连接的JS的HTML的来源来填充该标题
如本文所述:与Golang交叉来源的WebSocket
你不是指http ws或https wss吗。如果您从wss中删除了一个s,您应该能够连接。
如果你想要tls for web套接字(wss),那么你需要http。ListenAndServeTLS.
所以我放弃了使用Goolee的插座。io实现,并与gorilla一起使用。
我查看了他们的示例:https://github.com/gorilla/websocket/tree/master/examples/chat
签出他们的文档:http://www.gorillatoolkit.org/pkg/websocket--根据原产地考虑,我发现:
应用程序可以通过指定始终返回true的函数来允许来自任何源的连接:
var upgrader=websocket。升级程序{CheckOrigin:func(r*http.Request)bool{return true},}
在他们的示例中,我将这个CheckOrigin
函数添加到了conn.go
文件中,并且能够获得与浏览器对话的CORS套接字服务器。
作为进入戈兰的第一次冒险,这是令人沮丧和有趣的
Rust 的 async支持仍然是相当早期,并且仍在积极开发一些高-要求的功能,以及一些低标准的诊断程序。本章将讨论一些常见的痛点,并解释如何解决它们。
向左滚动 <div id="marquee1" data-content="这是一句话" class="ui-marquee"></div> require(['jquery', 'moye/Marquee'], function ($, Marquee) { new Marquee({ main: document.getElementById('marquee1'),
在有限空间内,循环播放同一类型的图片、文字等内容 基础用法 适用广泛的基础用法 结合使用el-carousel和el-carousel-item标签就得到了一个走马灯。幻灯片的内容是任意的,需要放在el-carousel-item标签中。默认情况下,在鼠标 hover 底部的指示器时就会触发切换。通过设置trigger属性为click,可以达到点击触发的效果。 <template> <div
Carousel 走马灯 在有限空间内,循环播放同一类型的图片、文字等内容 基础用法 适用广泛的基础用法 ::: demo 结合使用Carousel和Carousel.Item标签就得到了一个走马灯。幻灯片的内容是任意的,需要放在Carousel.Item标签中。默认情况下,在鼠标 hover 底部的指示器时就会触发切换。通过设置trigger属性为click,可以达到点击触发的效果。 rende
在有限空间内,循环播放同一类型的图片、文字等内容 基础用法 适用广泛的基础用法 默认情况下,鼠标 click 底部的指示器时就会触发切换。 通过设置 trigger 属性为 hover,可以达到 hover 触发的效果 <!-- 你可以通过 [(model)] 来指定一个初始值 --> <!-- 同时获得所有值变更的推送 --> <el-carousel height="150px"> <el
Carousel 走马灯 在有限空间内,循环播放同一类型的图片、文字等内容 基础用法 适用广泛的基础用法 结合使用el-carousel和el-carousel-item标签就得到了一个走马灯。幻灯片的内容是任意的,需要放在el-carousel-item标签中。默认情况下,在鼠标 hover 底部的指示器时就会触发切换。通过设置trigger属性为click,可以达到点击触发的效果。 <temp
客户端方面 分块 aiohttp现在不支持自定义分块大小了。至于分块的多大取决于开发者决定要放多少分块数据。如果chunking是允许的,aiohttp会将分块的内容以“Transfer-encoding: chunked”提供的格式编码。 aiohttp并不能自动编码分块内容,即使指定了transfer-encoding头信息也不行, 必须显式地设置chunked。如果设置了chunked,Tr
本文向大家介绍一个人上楼,他有两种走法,走一阶或走两阶,问他上30阶楼梯有几种走法?相关面试题,主要包含被问及一个人上楼,他有两种走法,走一阶或走两阶,问他上30阶楼梯有几种走法?时的应答技巧和注意事项,需要的朋友参考一下 设上n级楼梯的走法为a(n),则a(n)的值等于是a(n-1)的值与a(n-2)的值的和,比如上5级楼梯的走法是4级楼梯走法和3级楼梯走法的和,因为走3到级时再走一次(2级)就