Автор оригинала: SHAILESH B NAIR.
В современном мире разрабатываются многие веб и мобильные приложения, которые требуют связи в реальном времени между клиентом и серверами и серверными каркасами, особенно в областях, таких как игры, такие как игры, Fintech (ALGOTRADING, DATA CONTECTION) и т. Д. Я хотел бы поделиться дополнительными деталями, связанными с этой библиотекой сетевого сервера, которая Используется в языке программирования Golang и является полностью опорным, который можно получить в Github.
Nano является высокой структурой приложения в реальном времени, которая работает на основе протокола двоичного коммуникации, который разделен на слой сообщения и пакет, слой пакета обеспечивает серию связи, включающую в себя рукопожатие, сердцебиение и кодировку/декодирование/декодирование по потоку, и они передаются с использованием TCP или WebSocket и быстрее и безопасны для связи между клиентом и Golang Server на основе Server.
Код Server Side для реализации Nano Framework в Golang для разработки приложения чата.
//Это нано библиотеки для импорта на сервер.
"github.com/lonng/nano" "github.com/lonng/nano/component" "github.com/lonng/nano/pipeline" "github.com/lonng/nano/scheduler" "github.com/lonng/nano/serialize/json" "github.com/lonng/nano/session" // List of types to pass data between nano client and nano server components. type ( Room struct { group *nano.Group } // RoomManager represents a component that contains a bundle of room RoomManager struct { component.Base timer *scheduler.Timer rooms map[int]*Room } // UserMessage represents a message that user sent UserMessage struct { Name string `json:"name"` Content string `json:"content"` } // NewUser message will be received when new user join room NewUser struct { Content string `json:"content"` } // AllMembers contains all members uid AllMembers struct { Members []int64 `json:"members"` } // JoinResponse represents the result of joining room JoinResponse struct { Code int `json:"code"` Result string `json:"result"` } stats struct { component.Base timer *scheduler.Timer outboundBytes int inboundBytes int }
)
//Система определена исходящая функция для отложения статистики и рассчитать размер сообщения//сообщение. Func (STATS * STATS) Исходящий (S * Session.Session, MSG * Pipeline.message) Ошибка {stats.oundboundbytes (msg.data) return nil}
//Система определена входящая функция, чтобы отложить статистику и рассчитать размер//сообщение общение. FUNC (Статистика * Статистика) Входящие (S * Session.Session, MSG * Pipeline.message) Ошибка {stats.inboundbytes (msg.data) return nil}
FUNC (статистика * статистика) refeinit () {.newtimer (time.minute, func () {printLn (“outboundbytes”, stats.oundboundbytes) printLn (“Inboundbytes”, st.ountsboundbytes)})}
const ()
//Компонент, который начинается для создания нового чата. Func Newbookmanager () * RoomManager {Repeal & VoiceManager {Rooms: map [int] * номер {},}}
//Asfectinit Component Eventime Callback для закрытия чата и отображать журнал//на основе каждого чата. ФУНК (MGR * ROOMMANAGER) Asfeinit () {session.lifetime.onclosed (Func (S * SESSION) {If! S.Haskey (RoomidKey) {return} Room.value (RoomidKey). (* комната).Leave (ы)}) .newtimer (time.minute, func () {for russiod, комната mgr.rooms {println (fmt.sprintf (“usercount: russiod =% d, время =% s, count =% d” , ROOMID, Time.now (). String (), Room.group.count ()))}})}
//Функция, чтобы присоединиться к чату и отправить широковещательное сообщение всем объединенным членам в//сторона клиента. FUNC (MGR * ROOMMANAGER) Присоединяйтесь (S * Session.Session, MSG [] Байт) Ошибка {//Примечание: Присоединяйтесь только в тестовой комнате только в демонстрационной комнате, Найдено. Номера [Testriad] Если! Найдено {Room = & use {Группа: Nano .Newgroup (fmt.sprintf (“oom-% d”, testried)),}}
fakeUID := s.ID() //just use s.ID as uid !!! s.Bind(fakeUID) // binding session uids.Set(roomIDKey, room) s.Set(roomIDKey, room) s.Push("onMembers", &AllMembers{Members: room.group.Members()}) // notify others room.group.Broadcast("onNewUser", &NewUser{Content: fmt.Sprintf("New user: %d", s.ID())}) // new user join group room.group.Add(s) // add session to group return s.Response(&JoinResponse{Result: "success"})
}
//Сообщение синхронизации Последнее сообщение Всем членам Func (MGR * VoiceManager) Сообщение (S * Session.Session, MSG * Usermessage) Ошибка {Если! S.Haskey (RoomidKey) {return fmt.errorf (“не присоединиться к комнате”) } Room.Value (RoomidKey). (* комната) возврата Room.group.broadcast (“OnMessage”, MSG)}
//Основная функция Func Main () {Инициализация компонентов, регистрация чата
components := &component.Components{} components.Register( NewRoomManager(), component.WithName("room"), // rewrite component and handler name component.WithNameFunc(strings.ToLower), ) // traffic stats pip := pipeline.New() var stats = &stats{} pip.Outbound().PushBack(stats.outbound) pip.Inbound().PushBack(stats.inbound) log.SetFlags(log.LstdFlags | log.Llongfile) http.Handle("/web/", http.StripPrefix("/web/", http.FileServer(http.Dir("web")))) // Port to listen based on tcp from client based on /nano url. nano.Listen(":3250", nano.WithIsWebsocket(true), nano.WithPipeline(pip), nano.WithCheckOriginFunc(func(_ *http.Request) bool { return true }), nano.WithWSPath("/nano"), nano.WithDebugMode(), nano.WithSerializer(json.NewSerializer()), // override default serializer nano.WithComponents(components), )
}
Код клиента с использованием Vue.js и JavaScript для связи с кодированием сторон сервера.
<Мета> <название> чата демонстрация
- [ {{msg.name}}] {{msg.content}}}}
Дополнительные детали можно найти в URL Github: https://github.com/lonng/nano.