以下是一个基本的golang聊天系统示例,使用net
和bufio
包建立基于命令行的客户端和服务端连接。该示例可以让多个客户端之间进行文本聊天。
服务端代码:
package main
import (
"bufio"
"fmt"
"net"
"strings"
)
func main() {
fmt.Println("Starting server...")
ln, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println(err)
return
}
defer ln.Close()
for {
conn, err := ln.Accept()
if err != nil {
fmt.Println(err)
continue
}
fmt.Println(conn.RemoteAddr().String(), "connected")
go handleConnection(conn)
}
}
func handleConnection(conn net.Conn) {
username := conn.RemoteAddr().String()
defer conn.Close()
for {
message, err := bufio.NewReader(conn).ReadString('\n')
if err != nil {
fmt.Println(username, "disconnected")
return
}
message = strings.TrimSpace(message)
// check command
if strings.HasPrefix(message, "/") {
command := strings.Split(message[1:], " ")[0]
switch command {
case "username":
username = strings.Split(message[1:], " ")[1]
conn.Write([]byte(fmt.Sprintf("your username is set to %s\n", username)))
case "quit":
fmt.Println(username, "disconnected")
conn.Write([]byte("Goodbye!\n"))
return
default:
conn.Write([]byte(fmt.Sprintf("unknown command %s\n", command)))
}
} else {
fmt.Printf("%s: %s", username, message)
for _, c := range clients {
c.Write([]byte(fmt.Sprintf("%s: %s", username, message)))
}
}
}
}
客户端代码:
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print("-> ")
text, _ := reader.ReadString('\n')
fmt.Fprintln(conn, text)
message, err := bufio.NewReader(conn).ReadString('\n')
if err != nil {
fmt.Println(err)
return
}
fmt.Print("Server: " + message)
if strings.TrimSpace(text) == "/quit" {
fmt.Println("Connection terminated")
return
}
}
}
使用方法:
- 运行服务器代码
- 打开多个终端窗口,运行客户端代码,并按照提示输入用户名
- 在客户端窗口输入消息,消息将发送到服务器并在所有客户端窗口上显示
- 在客户端窗口输入
/quit
命令可以退出连接
该示例只是一个最基本的聊天系统,您可以根据需求对其进行更改和扩展。