Рубрики
Без рубрики

Библиотека сетевых серверов с использованием Golang

Общение в реальном времени в Golang между серверными и клиентскими каркасами с использованием JavaScript.

Автор оригинала: 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}}}}
StarX Websocket Библиотека ->

Дополнительные детали можно найти в URL Github: https://github.com/lonng/nano.