initial commit
This commit is contained in:
		
						commit
						28e5a1ba78
					
				
							
								
								
									
										3
									
								
								client/go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								client/go.mod
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
module pongclient
 | 
			
		||||
 | 
			
		||||
go 1.22.1
 | 
			
		||||
							
								
								
									
										5
									
								
								server/go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								server/go.mod
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
			
		||||
module sshpong
 | 
			
		||||
 | 
			
		||||
go 1.22.1
 | 
			
		||||
 | 
			
		||||
require github.com/google/uuid v1.6.0
 | 
			
		||||
							
								
								
									
										2
									
								
								server/go.sum
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								server/go.sum
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 | 
			
		||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
			
		||||
							
								
								
									
										5
									
								
								server/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								server/main.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										143
									
								
								server/netwrk/netwrk.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								server/netwrk/netwrk.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,143 @@
 | 
			
		||||
package netwrk
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/google/uuid"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Client struct {
 | 
			
		||||
	name string
 | 
			
		||||
	conn net.Conn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ClientPool struct {
 | 
			
		||||
	clients map[string]Client
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type GameClients struct {
 | 
			
		||||
	client1 Client
 | 
			
		||||
	client2 Client
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type GameConnections struct {
 | 
			
		||||
	games map[string]GameClients
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var clientPool *ClientPool
 | 
			
		||||
var gameConnections *GameConnections
 | 
			
		||||
 | 
			
		||||
func Listen() {
 | 
			
		||||
	clientPool = &ClientPool{
 | 
			
		||||
		clients: map[string]Client{},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	gameConnections = &GameConnections{
 | 
			
		||||
		games: map[string]GameClients{},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	listener, err := net.Listen("tcp", ":12345")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	defer listener.Close()
 | 
			
		||||
 | 
			
		||||
	go func() {
 | 
			
		||||
		for {
 | 
			
		||||
			conn, err := listener.Accept()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				log.Println(err)
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			name := make([]byte, 1024)
 | 
			
		||||
 | 
			
		||||
			n, err := conn.Read(name)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				log.Println(fmt.Sprintf("Failed to read from connection: %s", conn.LocalAddr()))
 | 
			
		||||
			} else {
 | 
			
		||||
				clientPool.clients[uuid.New().String()] = Client{
 | 
			
		||||
					name: string(name[:n]),
 | 
			
		||||
					conn: conn,
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetPool() (map[string]Client, bool) {
 | 
			
		||||
	if clientPool.clients != nil {
 | 
			
		||||
		return clientPool.clients, true
 | 
			
		||||
	}
 | 
			
		||||
	return clientPool.clients, false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func CreateGame(clientID1, clientID2 string) (string, error) {
 | 
			
		||||
	client1, ok := clientPool.clients[clientID1]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return "", fmt.Errorf("Client 1 was not found in client pool :(")
 | 
			
		||||
	}
 | 
			
		||||
	if err := client1.conn.SetWriteDeadline(time.Time{}); err != nil {
 | 
			
		||||
		return "", fmt.Errorf("Client 1 was not responsive")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	client2, ok := clientPool.clients[clientID2]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return "", fmt.Errorf("Client 2 was not found in client pool :(")
 | 
			
		||||
	}
 | 
			
		||||
	if err := client2.conn.SetWriteDeadline(time.Time{}); err != nil {
 | 
			
		||||
		return "", fmt.Errorf("Client 2 was not responsive")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	gameID := uuid.New().String()
 | 
			
		||||
	gameConnections.games[gameID] = GameClients{
 | 
			
		||||
		client1: client1,
 | 
			
		||||
		client2: client2,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	delete(clientPool.clients, clientID1)
 | 
			
		||||
	delete(clientPool.clients, clientID2)
 | 
			
		||||
 | 
			
		||||
	return gameID, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SendGameUpdateToClients(gameID string, bytes []byte) error {
 | 
			
		||||
	clients, ok := gameConnections.games[gameID]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return fmt.Errorf("Could not find game clients record")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err := clients.client1.conn.Write(bytes)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("Could not write to client1 connection")
 | 
			
		||||
	}
 | 
			
		||||
	_, err = clients.client1.conn.Write(bytes)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Errorf("Could not write to client2 connection")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func PingAndCleanLobbyClients() {
 | 
			
		||||
	ping := []byte("ping")
 | 
			
		||||
 | 
			
		||||
	deadClients := []string{}
 | 
			
		||||
	for id, client := range clientPool.clients {
 | 
			
		||||
		client.conn.SetWriteDeadline(time.Now().Add(time.Second))
 | 
			
		||||
		_, err := client.conn.Write(ping)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Println("Could not write to client, deleting connection:", id)
 | 
			
		||||
			deadClients = append(deadClients, id)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, id := range deadClients {
 | 
			
		||||
		delete(clientPool.clients, id)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user