first rendez vous:
1. two websocket clients connecting: one as agent and one as client 2. bidirectional communication between the two
This commit is contained in:
parent
ada8dee0aa
commit
f59c8368ea
73
cmd/converge/server.go
Normal file
73
cmd/converge/server.go
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"cidebug/pkg/iowrappers"
|
||||||
|
"fmt"
|
||||||
|
"github.com/gorilla/websocket"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
var upgrader = websocket.Upgrader{
|
||||||
|
ReadBufferSize: 1024,
|
||||||
|
WriteBufferSize: 1024,
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleWebSocket(w http.ResponseWriter, r *http.Request,
|
||||||
|
handler func(w http.ResponseWriter, r *http.Request, websockerConnection *iowrappers.WebSocketConn)) {
|
||||||
|
conn, err := upgrader.Upgrade(w, r, nil)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error upgrading to WebSocket:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
wsConn := iowrappers.NewWebSocketConn(conn)
|
||||||
|
defer wsConn.Close()
|
||||||
|
|
||||||
|
handler(w, r, wsConn)
|
||||||
|
}
|
||||||
|
|
||||||
|
type WebSocketService struct {
|
||||||
|
handler func(w http.ResponseWriter, r *http.Request, conn *iowrappers.WebSocketConn)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (endpoint *WebSocketService) handle(w http.ResponseWriter, r *http.Request) {
|
||||||
|
handleWebSocket(w, r, endpoint.handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
var client *iowrappers.WebSocketConn
|
||||||
|
var agent *iowrappers.WebSocketConn
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// Connect to TCP server
|
||||||
|
|
||||||
|
clientClosed := make(chan bool)
|
||||||
|
serverAvailable := make(chan bool)
|
||||||
|
|
||||||
|
registrationService := WebSocketService{
|
||||||
|
handler: func(w http.ResponseWriter, r *http.Request, conn *iowrappers.WebSocketConn) {
|
||||||
|
log.Println("Got registration connection")
|
||||||
|
agent = conn
|
||||||
|
serverAvailable <- true
|
||||||
|
<-clientClosed
|
||||||
|
},
|
||||||
|
}
|
||||||
|
clientService := WebSocketService{
|
||||||
|
handler: func(w http.ResponseWriter, r *http.Request, conn *iowrappers.WebSocketConn) {
|
||||||
|
log.Println("Got client connection")
|
||||||
|
client = conn
|
||||||
|
if agent == nil {
|
||||||
|
log.Println("There is no agent yet,, closing")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
iowrappers.SynchronizeStreams(client, agent)
|
||||||
|
clientClosed <- true
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
http.HandleFunc("/register", registrationService.handle)
|
||||||
|
http.HandleFunc("/client", clientService.handle)
|
||||||
|
|
||||||
|
// Start HTTP server
|
||||||
|
fmt.Println("WebSocket server listening on :8000")
|
||||||
|
log.Fatal(http.ListenAndServe(":8000", nil))
|
||||||
|
}
|
@ -5,25 +5,33 @@ import (
|
|||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func handleConnection(tcpConn net.Conn, wsURL string) {
|
func closeConnection(conn net.Conn) {
|
||||||
defer tcpConn.Close()
|
if tcpConn, ok := conn.(*net.TCPConn); ok {
|
||||||
|
tcpConn.SetLinger(0)
|
||||||
|
}
|
||||||
|
_ = conn.Close()
|
||||||
|
}
|
||||||
|
|
||||||
conn, _, err := websocket.DefaultDialer.Dial(wsURL, nil)
|
func handleConnection(conn net.Conn, wsURL string) {
|
||||||
wsConn := iowrappers.NewWebSocketConn(conn)
|
defer closeConnection(conn)
|
||||||
|
|
||||||
|
_wsConn, _, err := websocket.DefaultDialer.Dial(wsURL, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("WebSocket connection error:", err)
|
log.Println("WebSocket connection error:", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
wsConn := iowrappers.NewWebSocketConn(_wsConn)
|
||||||
defer wsConn.Close()
|
defer wsConn.Close()
|
||||||
|
|
||||||
iowrappers.SynchronizeStreams(wsConn, tcpConn)
|
iowrappers.SynchronizeStreams(wsConn, conn)
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
tcpPort := "7000"
|
tcpPort := os.Args[1]
|
||||||
wsURL := "ws://localhost:8000/ws" // Replace with your WebSocket server URL
|
wsURL := os.Args[2]
|
||||||
|
|
||||||
listener, err := net.Listen("tcp", ":"+tcpPort)
|
listener, err := net.Listen("tcp", ":"+tcpPort)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user