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:
Erik Brakkee 2024-07-19 19:31:34 +02:00
parent ada8dee0aa
commit f59c8368ea
2 changed files with 88 additions and 7 deletions

73
cmd/converge/server.go Normal file
View 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))
}

View File

@ -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 {