golang, TCP 프로토콜로 간단한 채팅방 구현
서버 측: 클라이언트로부터 연결 요청을 받고 연결을 만듭니다.모든 클라이언트의 연결은 연결 탱크에 넣고 메시지를 방송하는 데 사용됩니다.
클라이언트: 서버 연결;서버에 메시지 보내기;서버의 방송 메시지 수신하기;
주의사항: 어떤 클라이언트가 연결을 끊은 후 연결 탱크에서 제거해야 하며 방송 메시지를 더 이상 받지 않습니다.어떤 클라이언트가 연결을 끊은 후 서버 측이나 다른 클라이언트의 연결에 영향을 주지 못한다.
상세한 코드는 다음과 같다. 문서는 주석을 보면 된다. 더 이상 자세히 말하지 마라.
서버:
server.go
package main
import (
"net"
"log"
"fmt"
)
func main() {
port := "9090"
Start(port)
}
//
func Start(port string) {
host := ":" + port
// tcp
tcpAddr, err := net.ResolveTCPAddr("tcp4", host)
if err != nil {
log.Printf("resolve tcp addr failed: %v
", 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)
//
go BroadMessages(&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)
//
go Handler(conn, &conns, messageChan)
}
}
//
func BroadMessages(conns *map[string]net.Conn, messages chan string) {
for {
//
msg :=
클라이언트:client.go
package main
import (
"net"
"log"
"fmt"
"os"
)
func main() {
Start(os.Args[1])
}
func Start(tcpAddrStr string) {
tcpAddr, err := net.ResolveTCPAddr("tcp4", tcpAddrStr)
if err != nil {
log.Printf("Resolve tcp addr failed: %v
", err)
return
}
//
conn, err := net.DialTCP("tcp", nil, tcpAddr)
if err != nil {
log.Printf("Dial to server failed: %v
", err)
return
}
//
go SendMsg(conn)
//
buf := make([]byte, 1024)
for {
length, err := conn.Read(buf)
if err != nil {
log.Printf("recv server msg failed: %v
", err)
conn.Close()
os.Exit(0)
break
}
fmt.Println(string(buf[0:length]))
}
}
//
func SendMsg(conn net.Conn) {
username := conn.LocalAddr().String()
for {
var input string
// , input
fmt.Scanln(&input)
if input == "/q" || input == "/quit" {
fmt.Println("Byebye ...")
conn.Close()
os.Exit(0)
}
//
if len(input) > 0 {
msg := username + " say:" + input
_, err := conn.Write([]byte(msg))
if err != nil {
conn.Close()
break
}
}
}
}
테스트 방법:
번역 서버.go와client.go;터미널을 열고 서버를 시작하면 기본적으로 9090 포트를 감청합니다.여러 개의 터미널을 열고client를 시작합니다.client 시작 명령:client 서버 IP:9090;클라이언트에 문자를 입력하고 리턴하면 다른 단말기에서 메시지를 받을 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
k8spacket 및 Grafana를 통한 kubernetes용 TCP 패킷 트래픽 시각화보고 있지 않을 때 k8s 클러스터가 무엇을 하는지 알고 있습니까? 누가 그와 TCP 통신을 설정합니까? k8spacket 및 Grafana 를 사용하여 클러스터의 TCP 트래픽을 시각화할 수 있습니다. 설정된 연결...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.