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;클라이언트에 문자를 입력하고 리턴하면 다른 단말기에서 메시지를 받을 수 있습니다.

좋은 웹페이지 즐겨찾기