채팅 시스템 - 서버 측
채팅 시스템 - 서버 측
package main
import (
"fmt"
"log"
"net"
)
func main() {
port := "9090"
StartServer(port)
}
//
func StartServer(port string) {
host := ":" + port
// tcp
tcpAddr, err := net.ResolveTCPAddr("tcp4", host)
if err != nil {
log.Printf("resolve tcp addr failed:%v/n", err)
return
}
//
listener, err := net.ListenTCP("tcp", tcpAddr)
if err != nil {
log.Printf("Listen tcp port failed:%v
", err)
return
}
// ,
conns := make(map[string]net.Conn)
//
messageChan := make(chan string, 10)
//
BroadMessage(&conns, messageChan)
//
for {
fmt.Printf("listening port %s ...
", port)
conn, err := listener.AcceptTCP()
if err != nil {
log.Printf("Accept failed:%v
", err)
continue
}
//
conns[conn.RemoteAddr().String()] = conn
fmt.Println(conns)
//
Handler(conn, &conns, messageChan)
}
}
func Handler(conn net.Conn, conns *map[string]net.Conn, messages chan string) {
buf := make([]byte, 1024)
for {
length, err := conn.Read(buf)
if err != nil {
log.Printf("read client message failed:%v
", err)
delete(*conns, conn.RemoteAddr().String())
conn.Close()
break
}
//
recvStr := string(buf[0:length])
messages recvStr
}
}
//
func BroadMessage(conns *map[string]net.Conn, messages chan string) {
for {
//
msg := messages
fmt.Println(msg)
//
for key, conn := range *conns {
_, err := conn.Write([]byte(msg))
if err != nil {
log.Printf("broad message to %s failed:%v
", key, err)
delete(*conns, key)
}
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Go Fiber 및 PlanetScale로 REST API 구축 - 4부다시 사용자 핸들러에 UpdateUser라는 새 함수를 추가합니다. 업데이트 사용자를 main.go에 등록 이제 응용 프로그램을 다시 실행하십시오. 이전에 생성한 사용자를 업데이트합니다. 응답 사용자가 존재하지 않을...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.