didedoshka

distsys hw2

Sep 27th, 2025
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.67 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "context"
  5.     "fmt"
  6.     "log"
  7.     "net"
  8.     "os"
  9.     "sync"
  10.  
  11.     pb "dagorokhov/messenger/proto"
  12.     emptypb "google.golang.org/protobuf/types/known/emptypb"
  13.     timestamppb "google.golang.org/protobuf/types/known/timestamppb"
  14.  
  15.     grpc "google.golang.org/grpc"
  16. )
  17.  
  18. type messengerServer struct {
  19.     pb.UnimplementedMessengerServerServer
  20.     channels []chan *pb.Message
  21.     mutex    sync.Mutex
  22. }
  23.  
  24. func (s *messengerServer) SendMessage(ctx context.Context, message *pb.Message) (*pb.Reply, error) {
  25.     fmt.Println("got message", message)
  26.     reply := pb.Reply{SendTime: timestamppb.Now()}
  27.     message.SendTime = reply.SendTime
  28.  
  29.     s.mutex.Lock()
  30.     defer s.mutex.Unlock()
  31.  
  32.     for _, channel := range s.channels {
  33.         channel <- message
  34.     }
  35.     return &reply, nil
  36. }
  37.  
  38. func (s *messengerServer) ReadMessages(_ *emptypb.Empty, stream grpc.ServerStreamingServer[pb.Message]) error {
  39.     fmt.Println("connected to listen")
  40.     s.mutex.Lock()
  41.     s.channels = append(s.channels, make(chan *pb.Message))
  42.     channel := s.channels[len(s.channels)-1]
  43.     s.mutex.Unlock()
  44.  
  45.     for message := range channel {
  46.         fmt.Println("trying to send message", message)
  47.         if err := stream.Send(message); err != nil {
  48.             fmt.Println(err)
  49.             return err
  50.         }
  51.     }
  52.  
  53.     return nil
  54. }
  55.  
  56. func main() {
  57.     fmt.Println("starting server")
  58.     port := os.Getenv("MESSENGER_SERVER_PORT")
  59.     if port == "" {
  60.         port = "51075"
  61.     }
  62.  
  63.     lis, err := net.Listen("tcp", fmt.Sprintf("localhost:%v", port))
  64.     if err != nil {
  65.         log.Fatalf("failed to listen: %v", err)
  66.     }
  67.     var opts []grpc.ServerOption
  68.     grpcServer := grpc.NewServer(opts...)
  69.  
  70.     server := messengerServer{}
  71.     pb.RegisterMessengerServerServer(grpcServer, &server)
  72.  
  73.     grpcServer.Serve(lis)
  74. }
  75.  
Advertisement
Add Comment
Please, Sign In to add comment