[도해] 채팅방과 사용자의 모델링 [O'Reilley/Golang/웹 응용]
11867 단어 네트워크 애플리케이션모델OREILLYwebsocketGo
Go 언어로 웹 응용 프로그램 개발(O'Reilley)의 Chapter 1.모형도를 써서 2.4의 내용을 개괄하다
디자인을 하고 코드를 쓰거나 읽으면 이해하기 쉬우니까 참고로
모델링
사용자
client.go
type client struct {
socket *websocket.Conn
send chan []byte
room *room
}
채팅방소스 코드
room.go
type room struct {
forward chan []byte
join chan *client
leave chan *client
clients map[*client]bool
}
우편물을 수발하다.애당초read () 및 clientwrite () 가 서버 측면에서 읽기와 쓰기를 본 것인지 모르겠습니다.
소스 코드
client.go
func (c *client) read() {
for {
if _, msg, err := c.socket.ReadMessage(); err == nil {
c.room.forward <- msg
} else {
break
}
}
c.socket.Close()
}
func (c *client) write() {
for msg := range c.send {
if err := c.socket.WriteMessage(websocket.TextMessage, msg); err != nil {
break
}
}
c.socket.Close()
}
room.gofunc (r *room) run() {
for {
select {
// caseが同時に実行されることはない
case client := <-r.join:
// 参加
r.clients[client] = true
case client := <-r.leave:
// 退室
delete(r.clients, client)
close(client.send)
case msg := <-r.forward:
// すべてのクライアントにメッセージを転送
for client := range r.clients {
select {
// メッセージを送信
case client.send <- msg:
default:
// 送信に失敗
delete(r.clients, client)
close(client.send)
}
}
}
}
}
사용자와의 연결 설정참고로 발송과 수신 모드에서 설명하지 않은 첫 번째 사용자가 채팅방에 들어갈 때의 절차를 총결하였다.
room.go
const (
socketBufferSize = 1024
messageBuffuerSize = 256
)
// HTTP接続をアップグレードしてWebSocketを使えるようにする
var upgrader = &websocket.Upgrader{ReadBufferSize: socketBufferSize,WriteBufferSize: socketBufferSize}
func (r *room) ServeHTTP(w http.ResponseWriter, req *http.Request) {
// WebSocketコネクションを取得
socket, err := upgrader.Upgrade(w,req,nil)
if err != nil {
log.Fatal("ServeHTTP:", err)
return
}
client := &client{
socket: socket,
send: make(chan []byte,messageBuffuerSize),
room: r,
}
r.join <- client
defer func() {r.leave <- client}()
go client.write()
client.read()
}
참고 자료Go 언어로 웹 응용 프로그램 개발(O'Reilley)
Reference
이 문제에 관하여([도해] 채팅방과 사용자의 모델링 [O'Reilley/Golang/웹 응용]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/blackmax1886/items/437b24db5bb598687eec텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)