Proto/vcs.go

87 lines
1.4 KiB
Go
Raw Normal View History

2023-11-23 21:38:07 +00:00
package main
import (
"net"
"os"
"fmt"
"bufio"
)
type PutRequest struct {
file string
content string
callback chan bool
}
type VcsServer struct {
port uint16
q chan PutRequest
}
func NewVcsServer(port uint16) *VcsServer {
return &VcsServer{
port,
make(chan PutRequest),
}
}
type VcsSession struct{
server *VcsServer
con net.Conn
}
func NewVcsSession(server *VcsServer, con net.Conn) *VcsSession {
return &VcsSession{
server,
con,
}
}
func (s *VcsServer) central(){
for m := range s.q {
fmt.Printf("I %+v\n", m)
}
}
func (s *VcsServer) Run() {
go s.central()
addr := fmt.Sprintf("0.0.0.0:%d", s.port)
server, err := net.Listen("tcp", addr)
if err != nil {
fmt.Println("Error listening:", err.Error())
os.Exit(1)
}
defer server.Close()
fmt.Println("VcsServer waiting for client...")
for {
connection, err := server.Accept()
if err != nil {
fmt.Println("Error accepting: ", err.Error())
os.Exit(1)
}
fmt.Println("client connected")
s.processClient(connection)
}
close(s.q)
}
func (s *VcsServer) processClient(con net.Conn) {
session := NewVcsSession(s, con)
go session.vcsHandler()
}
func (s *VcsSession) vcsHandler() {
r := bufio.NewReaderSize(s.con, 102400)
msg, err := r.ReadString('\n')
for err == nil {
fmt.Print(msg)
msg, err = r.ReadString('\n')
}
}