testing remote gameplay

This commit is contained in:
2023-03-08 00:11:06 +00:00
parent 880266f986
commit f29ae4fbec
2 changed files with 208 additions and 207 deletions

View File

@@ -1,62 +1,62 @@
package core package core
import ( import (
"github.com/Akilan1999/p2p-rendering-computation/p2p/frp" "github.com/Akilan1999/p2p-rendering-computation/p2p/frp"
"time" "time"
) )
// EscapeNAT Func to escape NAT // EscapeNAT Func to escape NAT
// - 1 port for server // - 1 port for server
// - 2 port for barrierKVM // - 2 port for barrierKVM
func EscapeNAT(ScreenSharePort, GameplayServerPort string) (ServerPort string, ScreensharePort string, err error) { func EscapeNAT(ScreenSharePort, GameplayServerPort string) (ServerPort string, ScreensharePort string, err error) {
// Get free port from P2PRC server node // Get free port from P2PRC server node
serverPort, err := frp.GetFRPServerPort("http://64.227.168.102:8088") serverPort, err := frp.GetFRPServerPort("http://64.227.168.102:8088")
if err != nil { if err != nil {
return return
} }
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
// port for the remote gameplay server // port for the remote gameplay server
ServerPort, err = frp.StartFRPClientForServer("64.227.168.102", serverPort, GameplayServerPort) ServerPort, err = frp.StartFRPClientForServer("64.227.168.102", serverPort, GameplayServerPort)
if err != nil { if err != nil {
return return
} }
// Get free port from P2PRC server node // Get free port from P2PRC server node
ScreensharePortFRP, err := frp.GetFRPServerPort("http://64.227.168.102:8088") ScreensharePortFRP, err := frp.GetFRPServerPort("http://64.227.168.102:8088")
if err != nil { if err != nil {
return return
} }
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
// port for the screenshare port // port for the screenshare port
ScreensharePort, err = frp.StartFRPClientForServer("64.227.168.102", ScreensharePortFRP, ScreenSharePort) ScreensharePort, err = frp.StartFRPClientForServer("64.227.168.102", ScreensharePortFRP, ScreenSharePort)
if err != nil { if err != nil {
return return
} }
return return
} }
func EscapeNATBarrier() (barrierKVMport string, err error) { func EscapeNATBarrier() (barrierKVMport string, err error) {
// Get free port from P2PRC server node // Get free port from P2PRC server node
serverPort, err := frp.GetFRPServerPort("http://64.227.168.102:8088") serverPort, err := frp.GetFRPServerPort("http://64.227.168.102:8088")
if err != nil { if err != nil {
return return
} }
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
//port for the barrierKVM server //port for the barrierKVM server
barrierKVMport, err = frp.StartFRPClientForServer("64.227.168.102", serverPort, "24800") barrierKVMport, err = frp.StartFRPClientForServer("64.227.168.102", serverPort, "24798")
if err != nil { if err != nil {
return return
} }
return return
} }

View File

@@ -1,212 +1,213 @@
package core package core
import ( import (
"crypto/tls" "crypto/tls"
"fmt" "fmt"
"github.com/Akilan1999/remotegameplay/config" "github.com/Akilan1999/remotegameplay/config"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"log" "log"
"net/http" "net/http"
"time" "time"
) )
type WSMessage struct { type WSMessage struct {
SessionID string SessionID string
Type string Type string
Value string Value string
} }
var upgrader = websocket.Upgrader{ var upgrader = websocket.Upgrader{
ReadBufferSize: 1024, ReadBufferSize: 1024,
WriteBufferSize: 1024, WriteBufferSize: 1024,
} }
func sendHeartBeatWS(ticker *time.Ticker, conn *websocket.Conn, quit chan struct{}) { func sendHeartBeatWS(ticker *time.Ticker, conn *websocket.Conn, quit chan struct{}) {
for { for {
select { select {
case <-ticker.C: case <-ticker.C:
_ = conn.WriteJSON(WSMessage{ _ = conn.WriteJSON(WSMessage{
Type: "beat", Type: "beat",
}) })
case <-quit: case <-quit:
log.Println("heartbeat stopped") log.Println("heartbeat stopped")
return return
} }
} }
} }
func GetHttp() *http.ServeMux { func GetHttp() *http.ServeMux {
http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true} http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
server := http.NewServeMux() server := http.NewServeMux()
server.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("files/static")))) server.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("files/static"))))
server.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { server.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "files/main.html") http.ServeFile(w, r, "files/main.html")
}) })
//Get hostname of the current machine //Get hostname of the current machine
server.HandleFunc("/hostname", func(w http.ResponseWriter, r *http.Request) { server.HandleFunc("/hostname", func(w http.ResponseWriter, r *http.Request) {
// Read hostname from config file // Read hostname from config file
configResp, err := config.ConfigInit() configResp, err := config.ConfigInit()
if err != nil { if err != nil {
print(err) print(err)
return return
} }
fmt.Fprintf(w, configResp.SystemUsername) fmt.Fprintf(w, configResp.SystemUsername)
}) })
//Get SSH password of the current machine //Get SSH password of the current machine
server.HandleFunc("/SSHPassword", func(w http.ResponseWriter, r *http.Request) { server.HandleFunc("/SSHPassword", func(w http.ResponseWriter, r *http.Request) {
// Read hostname from config file // Read hostname from config file
configResp, err := config.ConfigInit() configResp, err := config.ConfigInit()
if err != nil { if err != nil {
print(err) print(err)
return return
} }
fmt.Fprintf(w, configResp.SSHPassword) fmt.Fprintf(w, configResp.SSHPassword)
}) })
server.HandleFunc("/ws_serve", func(writer http.ResponseWriter, request *http.Request) { server.HandleFunc("/ws_serve", func(writer http.ResponseWriter, request *http.Request) {
conn, _ := upgrader.Upgrade(writer, request, nil) conn, _ := upgrader.Upgrade(writer, request, nil)
room := NewRoom(conn) room := NewRoom(conn)
if err := conn.WriteJSON(WSMessage{ if err := conn.WriteJSON(WSMessage{
SessionID: "", SessionID: "",
Type: "newRoom", Type: "newRoom",
Value: room.ID, Value: room.ID,
}); err != nil { }); err != nil {
log.Println("newSessionWriteJsonError.", err) log.Println("newSessionWriteJsonError.", err)
return return
} }
go func(r *Room) { go func(r *Room) {
ticker := time.NewTicker(10 * time.Second) ticker := time.NewTicker(10 * time.Second)
quit := make(chan struct{}) quit := make(chan struct{})
defer func() { defer func() {
ticker.Stop() ticker.Stop()
_ = room.CallerConn.Close() _ = room.CallerConn.Close()
close(quit) close(quit)
RemoveRoom(r.ID) RemoveRoom(r.ID)
// Close the barrier session // Close the barrier session
if r.BarrierSession != nil { if r.BarrierSession != nil {
r.BarrierSession.DeleteBarrierSession() r.BarrierSession.DeleteBarrierSession()
} }
for sID, s := range r.Sessions { for sID, s := range r.Sessions {
_ = s.CalleeConn.WriteJSON(WSMessage{ _ = s.CalleeConn.WriteJSON(WSMessage{
Type: "roomClosed", Type: "roomClosed",
SessionID: sID, SessionID: sID,
}) })
} }
}() }()
go sendHeartBeatWS(ticker, conn, quit) go sendHeartBeatWS(ticker, conn, quit)
//noinspection ALL //noinspection ALL
defer room.CallerConn.Close() defer room.CallerConn.Close()
for { for {
var msg WSMessage var msg WSMessage
if err := room.CallerConn.ReadJSON(&msg); err != nil { if err := room.CallerConn.ReadJSON(&msg); err != nil {
log.Println("websocketError.", err) log.Println("websocketError.", err)
return return
} }
//log.Println(msg) //log.Println(msg)
s := room.GetSession(msg.SessionID) s := room.GetSession(msg.SessionID)
if s == nil { if s == nil {
log.Println("session nil.", msg.SessionID) log.Println("session nil.", msg.SessionID)
} }
if msg.Type == "addCallerIceCandidate" { if msg.Type == "addCallerIceCandidate" {
s.CallerIceCandidates = append(s.CallerIceCandidates, msg.Value) s.CallerIceCandidates = append(s.CallerIceCandidates, msg.Value)
} else if msg.Type == "gotOffer" { } else if msg.Type == "gotOffer" {
s.Offer = msg.Value s.Offer = msg.Value
} }
if err := s.CalleeConn.WriteJSON(msg); err != nil { if err := s.CalleeConn.WriteJSON(msg); err != nil {
log.Println("serveEchoWriteJsonError.", err) log.Println("serveEchoWriteJsonError.", err)
} }
} }
}(room) }(room)
}) })
server.HandleFunc("/ws_connect", func(writer http.ResponseWriter, request *http.Request) { server.HandleFunc("/ws_connect", func(writer http.ResponseWriter, request *http.Request) {
conn, _ := upgrader.Upgrade(writer, request, nil) conn, _ := upgrader.Upgrade(writer, request, nil)
ids, ok := request.URL.Query()["id"] ids, ok := request.URL.Query()["id"]
if !ok || ids[0] == "" { if !ok || ids[0] == "" {
return return
} }
room := GetRoom(ids[0]) room := GetRoom(ids[0])
ip, ok := request.URL.Query()["barrierip"] ip, ok := request.URL.Query()["barrierip"]
if ok && ip[0] != "" { if ok && ip[0] != "" {
//Declaring struct //Declaring struct
var barriersession Barrier var barriersession Barrier
barriersession.IPAddress = ip[0] barriersession.IPAddress = ip[0]
room.BarrierSession = &barriersession fmt.Println(ip[0])
// Creates a barrier session room.BarrierSession = &barriersession
err := room.BarrierSession.CreateBarrierSession() // Creates a barrier session
if err != nil { err := room.BarrierSession.CreateBarrierSession()
return if err != nil {
} return
} }
}
if room == nil { if room == nil {
_ = conn.WriteJSON(WSMessage{ _ = conn.WriteJSON(WSMessage{
Type: "roomNotFound", Type: "roomNotFound",
}) })
return return
} }
session := room.NewSession(conn) session := room.NewSession(conn)
if err := room.CallerConn.WriteJSON(WSMessage{ if err := room.CallerConn.WriteJSON(WSMessage{
SessionID: session.ID, SessionID: session.ID,
Type: "newSession", Type: "newSession",
Value: session.ID, Value: session.ID,
}); err != nil { }); err != nil {
log.Println("callerWriteJsonError.", err) log.Println("callerWriteJsonError.", err)
return return
} }
if err := conn.WriteJSON(WSMessage{ if err := conn.WriteJSON(WSMessage{
SessionID: session.ID, SessionID: session.ID,
Type: "newSession", Type: "newSession",
Value: session.ID, Value: session.ID,
}); err != nil { }); err != nil {
log.Println("calleeWriteJsonError.", err) log.Println("calleeWriteJsonError.", err)
return return
} }
go func(s *StreamSession) { go func(s *StreamSession) {
//noinspection ALL //noinspection ALL
defer s.CalleeConn.Close() defer s.CalleeConn.Close()
for { for {
var msg WSMessage var msg WSMessage
if err := conn.ReadJSON(&msg); err != nil { if err := conn.ReadJSON(&msg); err != nil {
log.Println("websocketError.", err) log.Println("websocketError.", err)
return return
} }
//log.Println(msg) //log.Println(msg)
if msg.SessionID == s.ID { if msg.SessionID == s.ID {
if msg.Type == "addCalleeIceCandidate" { if msg.Type == "addCalleeIceCandidate" {
s.CalleeIceCandidates = append(s.CalleeIceCandidates, msg.Value) s.CalleeIceCandidates = append(s.CalleeIceCandidates, msg.Value)
} else if msg.Type == "gotAnswer" { } else if msg.Type == "gotAnswer" {
s.Answer = msg.Value s.Answer = msg.Value
} }
if err := s.CallerConn.WriteJSON(msg); err != nil { if err := s.CallerConn.WriteJSON(msg); err != nil {
log.Println("connectEchoWriteJsonError.", err) log.Println("connectEchoWriteJsonError.", err)
} }
} }
} }
}(session) }(session)
}) })
return server return server
} }