func giveCoupledSockets(id1, id2 uint64) (*mexsocket.MexSocket, *mexsocket.MexSocket) { conn1, err := net.Dial("tcp", addr+":"+strconv.Itoa(port)) conn2 := <-newConn if err != nil || conn2 == nil { return nil, nil } s1 := mexsocket.New(id1, conn1) s2 := mexsocket.New(id2, conn2) return s1, s2 }
//start the mock server. It gets a tcp connection func (server *MockServer) Run(port int, autoReadRoutine bool) { ln, err := net.Listen("tcp", ":"+strconv.Itoa(port)) if err != nil { fmt.Println(err) os.Exit(1) } log.Println("Mock server running on port", port) server.listener = ln go func() { for { select { case <-server.quit: server.quitDone <- true return default: conn, err := ln.Accept() if err != nil { fmt.Println(err) continue } s := mexsocket.New(server.nextId, conn) server.sockets[server.nextId] = s //notify that a new client connected server.Clichan <- server.nextId if autoReadRoutine { go server.newConnection(server.nextId, s) } server.nextId++ } } }() }
func (c *Client) Connect(address string, port int) error { //already connected or pending connection if c.socket != nil { return errors.New("client connection already open") } //dial the connection to the server conn, err := net.Dial("tcp", address+":"+strconv.Itoa(port)) if err != nil { return err } //enable connection on client c.socket = mexsocket.New(0, conn) go c.handleConnection() idMex := message.NewRequest(message.Identity) _, err = c.socket.Send(idMex) return err }
func (hub *Hub) handleConnection(conn net.Conn) { //get an id from pool id := hub.idPool.GetId() //create a new socket s := mexsocket.New(id, conn) //enable socket service goroutines go s.StartReadService(mexsocket.ModeServer) go s.StartWriteService() //add socket to map hub.socketMap.Set(id, s) //add id to Set hub.idSet.Add(id) for { select { //received a request to process case mex, ok := <-s.Incoming(): if ok { go hub.processRequest(s, mex.(*message.Request)) } //client is closing. Terminate loop case <-s.QuitChan(): //remove client info from structures hub.socketMap.Remove(id) hub.idSet.Remove(id) return } } }