diff --git a/src/newnius.com/client/client.go b/src/newnius.com/client/client.go new file mode 100644 index 0000000..db01a2a --- /dev/null +++ b/src/newnius.com/client/client.go @@ -0,0 +1,74 @@ +package main + +import ( + "fmt" + "log" + "time" + pb "newnius.com/ntp" + "golang.org/x/net/context" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" +) + +const ( + address = "ntp.newnius.com:8844" +) + +var delay time.Duration + +func getTime() time.Time { + return time.Now().Add(delay) +} + +func tick () { + for { + t := getTime() + fmt.Printf("Current: %v/%v %02d:%02d:%02d\n", int(t.Month()), t.Day(), t.Hour(), t.Minute(), t.Second()); + time.Sleep(1000 * time.Millisecond) + } +} + +func sync() { + creds, err := credentials.NewClientTLSFromFile("server-cert.pem", "ntp.newnius.com") + if err != nil { + log.Fatalf("cert load error: %s", err) + } + + //conn, err := grpc.Dial(address, grpc.WithInsecure()) + conn, err := grpc.Dial(address, grpc.WithTransportCredentials(creds)) + if err != nil { + log.Fatalf("unable to connect: %v", err) + } + defer conn.Close() + + var c pb.NtpClient + + for { + time.Sleep(5000 * time.Millisecond) + c = pb.NewNtpClient(conn) + start := time.Now().UnixNano() + //time.Sleep(5000 * time.Millisecond) + r, err := c.Query(context.Background(), &pb.NtpRequest{}) + //time.Sleep(5000 * time.Millisecond) + if err != nil { + fmt.Printf("WARNING: unable to sync: %v\n", err) + continue + } + //fmt.Printf("Greeting: %v %s\n", i, r.Message) + //current = t.Add(time.Since(start) / 2) + //fmt.Println(r.Message) + m := ( time.Now().UnixNano() - start ) / 2 ;// / int64(time.Millisecond); + //fmt.Println(time.Duration(m)) + delay = time.Duration(r.Message - start - m) + //fmt.Println(delay) + fmt.Printf("RPC call cost %v\n", time.Duration(m * 2)) + //fmt.Printf("RPC call cost %v\n", time.Since(start)) + //fmt.Printf("call cost %v\n", int64(time.Since(start) / time.Microsecond)) + fmt.Println("DEBUG: synced") + } +} + +func main() { + go sync() + tick() +} diff --git a/src/newnius.com/client/server-cert.pem b/src/newnius.com/client/server-cert.pem new file mode 100644 index 0000000..584d71f --- /dev/null +++ b/src/newnius.com/client/server-cert.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIFCjCCAvKgAwIBAgIJAIWzLYS8OHW6MA0GCSqGSIb3DQEBCwUAMBoxGDAWBgNV +BAMMD250cC5uZXduaXVzLmNvbTAeFw0xNzEwMjEwNzM2NTRaFw0xODEwMjEwNzM2 +NTRaMBoxGDAWBgNVBAMMD250cC5uZXduaXVzLmNvbTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAL8Zedi6flVGEwHLq645WiTqLznRTImBRmEg+yLOsyyx +eLwAqJ+8lX9juIOX2QhDHltePegiHj9brFP2ClykHZEQjUdXHNsqEppUCz2Aozdg +RhCI08gYq8AQFOFZx8hXHiZVS31zhQU9+lLKhwz/cJK2vGWTwwTgqBp3vlIHOUEg +GMiatbBeEyK9w3TggYAhnONns0gBy/cQS0SJukIp6Ii/3h3AXXxoP1OUUn81mtkT +VNdBPqeH87T43jJJtQyOM+qetpTJvcAmpRksuca6i57HwwCnnTgo5TL7V8BXugHv +PLbyVLbNmaaX2AN5JqB9gz/67sSzsbVmgLl2nLoozAYuemWCO1rGBl/ked/+DPW5 +IbBtl+a6r7hWxMmEZgbJWS0RxUlhyAWqWCpzkyTomlw+TCkctHTyJCpCsWPbdtFK +7E1fhEHdZn9NwmLuhAKgRcGGGSHYMhE8rsQOrwnTLS9N+YmdWe1n1Yav69/LDzkS ++oA7rXI9feQfv2WVQBbbiza8iKg4ioUSV50/0OJboyBUC4TfEwD+Hr9Z5kh1g/mi +W7i5821uvzm8aMtRnTir6NOqSkK2+BLBqoxC76FjsU2NOM4BvY6Ud2kV6JMIlXBv +2GbrA9skIz/kSFnnFZDizO6b7AGSEPkPxhPhr8fsX05Vfk8pzTBZx2RKv63kKUFF +AgMBAAGjUzBRMB0GA1UdDgQWBBRFl2xB7OAsxgAkVEFHzMhKLOTPAjAfBgNVHSME +GDAWgBRFl2xB7OAsxgAkVEFHzMhKLOTPAjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBCwUAA4ICAQBAFReyFUNFQUgb1ycfJFoPQ94VhtRunB3cl6Lg2Fukhfpn +Yf7gj3r3v7daJcUY1TOddi/xaOAb70Y7V/JRPNpMq6FgZR8t+s2IbkcZcZ5JdmoF +7MGXtj8G357SPLeEGsNDqfnWddvWDSXcH3OHONRL0ArVhFKff+KNIcimPgAQrDt0 +GkKe2W74//8wMkEbMIt6r+dozBV+NKgWM7SSRW7FKlyzT5og1MuRG9gbebVFli+I +ABRHy3N4DJiyu8DtlQooLwC4aEBW0nUPzjYobIaoVvltAc88WMEDkvLyqc1H1Rbv +OFIzA0jmGBDBE3ESbndEdUz4m7ekWO4+6dSWL5InRhDSWGlDgq1V22yocP6hmRvT +stu4e79o4Y5+HVWEIqkpOCHKdye/CcevFt4Z9fYNMxHUEPYv655JE+ocIyEU53X8 +9FmFxt0ACp0eyx0y9MFD5mkw7FWVi7Lp1OjljDQelDNf2C6rsTH66a3Cgk3dnUgg +9C+WrgYEKBkDODXZgtMaNBhgX/Py+l4CyODvhF6J/BFG/G+vRlU4Fan1g2C94RtQ +dU2xEoao0g2d61Q5WoZ4RfJ7LHD+QXqOKrcEuLTk+eSY5nj16kZc12yM59zBmpip +Cbr10Ix7ffoaADxUqpjiK+3q5pzWGQjapMVxU5ZUt0mFvI2p6UE0n18mW0q4tw== +-----END CERTIFICATE----- diff --git a/src/newnius.com/ntp/ntp.pb.go b/src/newnius.com/ntp/ntp.pb.go new file mode 100644 index 0000000..83ca5a6 --- /dev/null +++ b/src/newnius.com/ntp/ntp.pb.go @@ -0,0 +1,151 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: ntp.proto + +/* +Package ntp is a generated protocol buffer package. + +It is generated from these files: + ntp.proto + +It has these top-level messages: + NtpRequest + NtpReply +*/ +package ntp + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +import ( + context "golang.org/x/net/context" + grpc "google.golang.org/grpc" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type NtpRequest struct { +} + +func (m *NtpRequest) Reset() { *m = NtpRequest{} } +func (m *NtpRequest) String() string { return proto.CompactTextString(m) } +func (*NtpRequest) ProtoMessage() {} +func (*NtpRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +type NtpReply struct { + // string message = 1; + Message int64 `protobuf:"varint,1,opt,name=message" json:"message,omitempty"` +} + +func (m *NtpReply) Reset() { *m = NtpReply{} } +func (m *NtpReply) String() string { return proto.CompactTextString(m) } +func (*NtpReply) ProtoMessage() {} +func (*NtpReply) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } + +func (m *NtpReply) GetMessage() int64 { + if m != nil { + return m.Message + } + return 0 +} + +func init() { + proto.RegisterType((*NtpRequest)(nil), "ntp.NtpRequest") + proto.RegisterType((*NtpReply)(nil), "ntp.NtpReply") +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// Client API for Ntp service + +type NtpClient interface { + Query(ctx context.Context, in *NtpRequest, opts ...grpc.CallOption) (*NtpReply, error) +} + +type ntpClient struct { + cc *grpc.ClientConn +} + +func NewNtpClient(cc *grpc.ClientConn) NtpClient { + return &ntpClient{cc} +} + +func (c *ntpClient) Query(ctx context.Context, in *NtpRequest, opts ...grpc.CallOption) (*NtpReply, error) { + out := new(NtpReply) + err := grpc.Invoke(ctx, "/ntp.Ntp/Query", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Server API for Ntp service + +type NtpServer interface { + Query(context.Context, *NtpRequest) (*NtpReply, error) +} + +func RegisterNtpServer(s *grpc.Server, srv NtpServer) { + s.RegisterService(&_Ntp_serviceDesc, srv) +} + +func _Ntp_Query_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NtpRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NtpServer).Query(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ntp.Ntp/Query", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NtpServer).Query(ctx, req.(*NtpRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Ntp_serviceDesc = grpc.ServiceDesc{ + ServiceName: "ntp.Ntp", + HandlerType: (*NtpServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Query", + Handler: _Ntp_Query_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "ntp.proto", +} + +func init() { proto.RegisterFile("ntp.proto", fileDescriptor0) } + +var fileDescriptor0 = []byte{ + // 142 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0xcc, 0x2b, 0x29, 0xd0, + 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0xce, 0x2b, 0x29, 0x50, 0xe2, 0xe1, 0xe2, 0xf2, 0x2b, + 0x29, 0x08, 0x4a, 0x2d, 0x2c, 0x4d, 0x2d, 0x2e, 0x51, 0x52, 0xe1, 0xe2, 0x00, 0xf3, 0x0a, 0x72, + 0x2a, 0x85, 0x24, 0xb8, 0xd8, 0x73, 0x53, 0x8b, 0x8b, 0x13, 0xd3, 0x53, 0x25, 0x18, 0x15, 0x18, + 0x35, 0x98, 0x83, 0x60, 0x5c, 0x23, 0x03, 0x2e, 0x66, 0xbf, 0x92, 0x02, 0x21, 0x4d, 0x2e, 0xd6, + 0xc0, 0xd2, 0xd4, 0xa2, 0x4a, 0x21, 0x7e, 0x3d, 0x90, 0xa1, 0x08, 0x63, 0xa4, 0x78, 0x11, 0x02, + 0x05, 0x39, 0x95, 0x4a, 0x0c, 0x4e, 0x22, 0x5c, 0x42, 0xc9, 0xf9, 0xb9, 0x7a, 0xc9, 0xf9, 0x39, + 0xf9, 0x49, 0xa5, 0x7a, 0x45, 0x05, 0xc9, 0x25, 0xa9, 0xc5, 0x25, 0x49, 0x6c, 0x60, 0x77, 0x18, + 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x7d, 0x39, 0x97, 0x07, 0x94, 0x00, 0x00, 0x00, +} diff --git a/src/newnius.com/ntp/ntp.proto b/src/newnius.com/ntp/ntp.proto new file mode 100644 index 0000000..cf1002f --- /dev/null +++ b/src/newnius.com/ntp/ntp.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; + +option java_package = "com.colobu.rpctest"; + +package ntp; + +service Ntp { + rpc Query (NtpRequest) returns (NtpReply) {} +} + +message NtpRequest { + //string timezone = 1; +} + +message NtpReply { + //string message = 1; + int64 message = 1; +} diff --git a/src/newnius.com/server/server-cert.pem b/src/newnius.com/server/server-cert.pem new file mode 100644 index 0000000..584d71f --- /dev/null +++ b/src/newnius.com/server/server-cert.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIFCjCCAvKgAwIBAgIJAIWzLYS8OHW6MA0GCSqGSIb3DQEBCwUAMBoxGDAWBgNV +BAMMD250cC5uZXduaXVzLmNvbTAeFw0xNzEwMjEwNzM2NTRaFw0xODEwMjEwNzM2 +NTRaMBoxGDAWBgNVBAMMD250cC5uZXduaXVzLmNvbTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAL8Zedi6flVGEwHLq645WiTqLznRTImBRmEg+yLOsyyx +eLwAqJ+8lX9juIOX2QhDHltePegiHj9brFP2ClykHZEQjUdXHNsqEppUCz2Aozdg +RhCI08gYq8AQFOFZx8hXHiZVS31zhQU9+lLKhwz/cJK2vGWTwwTgqBp3vlIHOUEg +GMiatbBeEyK9w3TggYAhnONns0gBy/cQS0SJukIp6Ii/3h3AXXxoP1OUUn81mtkT +VNdBPqeH87T43jJJtQyOM+qetpTJvcAmpRksuca6i57HwwCnnTgo5TL7V8BXugHv +PLbyVLbNmaaX2AN5JqB9gz/67sSzsbVmgLl2nLoozAYuemWCO1rGBl/ked/+DPW5 +IbBtl+a6r7hWxMmEZgbJWS0RxUlhyAWqWCpzkyTomlw+TCkctHTyJCpCsWPbdtFK +7E1fhEHdZn9NwmLuhAKgRcGGGSHYMhE8rsQOrwnTLS9N+YmdWe1n1Yav69/LDzkS ++oA7rXI9feQfv2WVQBbbiza8iKg4ioUSV50/0OJboyBUC4TfEwD+Hr9Z5kh1g/mi +W7i5821uvzm8aMtRnTir6NOqSkK2+BLBqoxC76FjsU2NOM4BvY6Ud2kV6JMIlXBv +2GbrA9skIz/kSFnnFZDizO6b7AGSEPkPxhPhr8fsX05Vfk8pzTBZx2RKv63kKUFF +AgMBAAGjUzBRMB0GA1UdDgQWBBRFl2xB7OAsxgAkVEFHzMhKLOTPAjAfBgNVHSME +GDAWgBRFl2xB7OAsxgAkVEFHzMhKLOTPAjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBCwUAA4ICAQBAFReyFUNFQUgb1ycfJFoPQ94VhtRunB3cl6Lg2Fukhfpn +Yf7gj3r3v7daJcUY1TOddi/xaOAb70Y7V/JRPNpMq6FgZR8t+s2IbkcZcZ5JdmoF +7MGXtj8G357SPLeEGsNDqfnWddvWDSXcH3OHONRL0ArVhFKff+KNIcimPgAQrDt0 +GkKe2W74//8wMkEbMIt6r+dozBV+NKgWM7SSRW7FKlyzT5og1MuRG9gbebVFli+I +ABRHy3N4DJiyu8DtlQooLwC4aEBW0nUPzjYobIaoVvltAc88WMEDkvLyqc1H1Rbv +OFIzA0jmGBDBE3ESbndEdUz4m7ekWO4+6dSWL5InRhDSWGlDgq1V22yocP6hmRvT +stu4e79o4Y5+HVWEIqkpOCHKdye/CcevFt4Z9fYNMxHUEPYv655JE+ocIyEU53X8 +9FmFxt0ACp0eyx0y9MFD5mkw7FWVi7Lp1OjljDQelDNf2C6rsTH66a3Cgk3dnUgg +9C+WrgYEKBkDODXZgtMaNBhgX/Py+l4CyODvhF6J/BFG/G+vRlU4Fan1g2C94RtQ +dU2xEoao0g2d61Q5WoZ4RfJ7LHD+QXqOKrcEuLTk+eSY5nj16kZc12yM59zBmpip +Cbr10Ix7ffoaADxUqpjiK+3q5pzWGQjapMVxU5ZUt0mFvI2p6UE0n18mW0q4tw== +-----END CERTIFICATE----- diff --git a/src/newnius.com/server/server-key.pem b/src/newnius.com/server/server-key.pem new file mode 100644 index 0000000..951dcd6 --- /dev/null +++ b/src/newnius.com/server/server-key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +kXi0ZhYY/qI+4S8d3TosuUee/Wvwwe21 +-----END PRIVATE KEY----- diff --git a/src/newnius.com/server/server.go b/src/newnius.com/server/server.go new file mode 100644 index 0000000..e5f7696 --- /dev/null +++ b/src/newnius.com/server/server.go @@ -0,0 +1,54 @@ +package main + +import ( + "log" + "net" + "time" + "golang.org/x/net/context" + "google.golang.org/grpc" + pb "newnius.com/ntp" + "google.golang.org/grpc/credentials" +) + +var ( + certFile = "server-cert.pem" + keyFile = "server-key.pem" +) + +const ( + port = ":8844" +) + +type server struct{} + +func (s *server) Query(ctx context.Context, in *pb.NtpRequest) (*pb.NtpReply, error) { + //loc, err := time.LoadLocation(in.Timezone) + //if err != nil { + // zone, _ := time.Now().Zone() + // loc, _ = time.LoadLocation(zone) + //} + //set timezone, + //now := time.Now().In(loc) + return &pb.NtpReply{Message: time.Now().UnixNano() + 100000000000}, nil +} + +func main() { + creds, err := credentials.NewServerTLSFromFile(certFile, keyFile) + if err != nil { + log.Fatalf("Failed to setup tls: %v", err) + } + //log.Println(creds) + lis, err := net.Listen("tcp", port) + if err != nil { + log.Fatalf("failed to listen: %v", err) + } + s := grpc.NewServer( + grpc.Creds(creds), + ) + pb.RegisterNtpServer(s, &server{}) + //reflection.Register(s) + //if err := s.Serve(lis); err != nil { + // log.Fatal("failed to serve: %v", err) + //} + s.Serve(lis) +} diff --git a/src/rpc/client/client b/src/rpc/client/client new file mode 100755 index 0000000..b704408 Binary files /dev/null and b/src/rpc/client/client differ diff --git a/src/rpc/client/client.go b/src/rpc/client/client.go new file mode 100644 index 0000000..31411f8 --- /dev/null +++ b/src/rpc/client/client.go @@ -0,0 +1,48 @@ +package main + +import ( + "errors" + "net/rpc" + "log" + "fmt" +) + +type Args struct { + A, B int +} + +type Quotient struct { + Quo, Rem int +} + +type Arith int + +func (t *Arith) Multiply(args *Args, reply *int) error { + *reply = args.A * args.B + return nil +} + +func (t *Arith) Divide(args *Args, quo *Quotient) error { + if args.B == 0 { + return errors.New("divide by zero") + } + quo.Quo = args.A / args.B + quo.Rem = args.A % args.B + return nil +} + +func main() { + serverAddress := "127.0.0.1" + client, err := rpc.DialHTTP("udp", serverAddress + ":1234") + if err != nil { + log.Fatal("Fatal error:", err) + } + //args := &server.Args{7, 8} + var args Args = Args{7, 8} + var reply int + err = client.Call("Arith.Multiply", args, &reply) + if err != nil { + log.Fatal("arith error:", err) + } + fmt.Printf("Arith: %d * %d = %d", args.A, args.B, reply) +} diff --git a/src/rpc/server/server b/src/rpc/server/server new file mode 100755 index 0000000..c76e932 Binary files /dev/null and b/src/rpc/server/server differ diff --git a/src/rpc/server/server.go b/src/rpc/server/server.go new file mode 100644 index 0000000..70768b6 --- /dev/null +++ b/src/rpc/server/server.go @@ -0,0 +1,44 @@ +package main + +import ( + "errors" + "net/rpc" + "net" + "log" + "net/http" +) + +type Args struct { + A, B int +} + +type Quotient struct { + Quo, Rem int +} + +type Arith int + +func (t *Arith) Multiply(args *Args, reply *int) error { + *reply = args.A * args.B + return nil +} + +func (t *Arith) Divide(args *Args, quo *Quotient) error { + if args.B == 0 { + return errors.New("divide by zero") + } + quo.Quo = args.A / args.B + quo.Rem = args.A % args.B + return nil +} + +func main() { + arith := new(Arith) + rpc.Register(arith) + rpc.HandleHTTP() + l, e := net.Listen("udp", ":1234") + if e != nil { + log.Fatal("Fatal error:", e) + } + http.Serve(l, nil) +}