package main import ( "fmt" "sync" "time" "github.com/kataras/iris" "github.com/kataras/iris/context" "github.com/kataras/iris/view" "github.com/kataras/iris/websocket" ) type clientPage struct { Title string Host string } func main() { app := iris.New() app.AttachView(view.HTML("./templates", ".html")) // select the html engine to serve templates ws := websocket.New(websocket.Config{ // the request path which the websocket client should listen/registered to the server, // the endpoint is like a route. Endpoint: "/my_endpoint", // the client-side javascript static file path // which will be served by Iris. // default is /iris-ws.js // if you change that you have to change the bottom of templates/client.html // script tag: ClientSourcePath: "/iris-ws.js", // // Set the timeouts, 0 means no timeout // websocket has more configuration, go to ../../config.go for more: // WriteTimeout: 0, // ReadTimeout: 0, // by-default all origins are accepted, you can change this behavior by setting: // CheckOrigin: (r *http.Request ) bool {}, // // // IDGenerator used to create (and later on, set) // an ID for each incoming websocket connections (clients). // The request is an argument which you can use to generate the ID (from headers for example). // If empty then the ID is generated by DefaultIDGenerator: randomString(64): // IDGenerator func(ctx context.Context) string {}, }) ws.Attach(app) // adapt the application to the websocket server app.StaticWeb("/js", "./static/js") // serve our custom javascript code app.Get("/", func(ctx context.Context) { ctx.ViewData("", clientPage{"Client Page", "localhost:8080"}) ctx.View("client.html") }) Conn := make(map[websocket.Connection]bool) var myChatRoom = "room1" var mutex = new(sync.Mutex) ws.OnConnection(func(c websocket.Connection) { c.Join(myChatRoom) mutex.Lock() Conn[c] = true mutex.Unlock() c.On("chat", func(message string) { if message == "leave" { c.Leave(myChatRoom) c.To(myChatRoom).Emit("chat", "Client with ID: "+c.ID()+" left from the room and cannot send or receive message to/from this room.") c.Emit("chat", "You have left from the room: "+myChatRoom+" you cannot send or receive any messages from others inside that room.") return } }) c.OnDisconnect(func() { mutex.Lock() delete(Conn, c) mutex.Unlock() fmt.Printf("\nConnection with ID: %s has been disconnected!\n", c.ID()) }) }) var delay = 1 * time.Second go func() { i := 0 for { mutex.Lock() broadcast(Conn, fmt.Sprintf("aaaa %d\n", i)) mutex.Unlock() time.Sleep(delay) i++ } }() go func() { i := 0 for { mutex.Lock() broadcast(Conn, fmt.Sprintf("aaaa2 %d\n", i)) mutex.Unlock() time.Sleep(delay) i++ } }() app.Run(iris.Addr(":8080")) } func broadcast(Conn map[websocket.Connection]bool, message string) { for k := range Conn { k.To("room1").Emit("chat", message) } }