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"
|
||||
"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 {
|
||||
|
Loading…
Reference in New Issue
Block a user