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"
"log"
"net"
"os"
)
func handleConnection(tcpConn net.Conn, wsURL string) {
defer tcpConn.Close()
func closeConnection(conn net.Conn) {
if tcpConn, ok := conn.(*net.TCPConn); ok {
tcpConn.SetLinger(0)
}
_ = conn.Close()
}
conn, _, err := websocket.DefaultDialer.Dial(wsURL, nil)
wsConn := iowrappers.NewWebSocketConn(conn)
func handleConnection(conn net.Conn, wsURL string) {
defer closeConnection(conn)
_wsConn, _, err := websocket.DefaultDialer.Dial(wsURL, nil)
if err != nil {
log.Println("WebSocket connection error:", err)
return
}
wsConn := iowrappers.NewWebSocketConn(_wsConn)
defer wsConn.Close()
iowrappers.SynchronizeStreams(wsConn, tcpConn)
iowrappers.SynchronizeStreams(wsConn, conn)
}
func main() {
tcpPort := "7000"
wsURL := "ws://localhost:8000/ws" // Replace with your WebSocket server URL
tcpPort := os.Args[1]
wsURL := os.Args[2]
listener, err := net.Listen("tcp", ":"+tcpPort)
if err != nil {