// 客户端应用 package main import ( "flag" "fmt" "io" "net" "os" ) type Client struct { ServerIp string ServerPort int Name string conn net.Conn flag int // 当前client模式 } func NewClient(serverIp string, serverPort int) *Client { // 创建Client对象 client := &Client{ ServerIp: serverIp, ServerPort: serverPort, flag: 999, } // 连接Server conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", serverIp, serverPort)) if err != nil { fmt.Println("net.Dial err:", err) return nil } client.conn = conn // 返回Client对象 return client } func (client *Client) menu() bool { var flag int fmt.Println("1. 公聊模式") fmt.Println("2. 私聊模式") fmt.Println("3. 更新用户名") fmt.Println("0. 退出") fmt.Scanln(&flag) client.flag = flag if flag >= 0 && flag <= 3 { return true } else { fmt.Println(">>>>>> 请输入合法的数字 <<<<<<") return false } } // client的更新用户名接口 func (client *Client) UpdateName() bool { fmt.Println(">>>>>> 请输入新用户名:") fmt.Scanln(&client.Name) sendMsg := "rename|" + client.Name + "\n" _, err := client.conn.Write([]byte(sendMsg)) if err != nil { fmt.Println("conn.Write err:", err) return false } return true } func (client *Client) Run() { for client.flag != 0 { for !client.menu() { } // 根据不同的模式处理不同的业务 switch client.flag { case 1: // 公聊模式 fmt.Println("已选择公聊模式...") case 2: // 私聊模式 fmt.Println("已选择私聊模式...") case 3: // 更新用户名 fmt.Println("已选择更新用户名模式...") client.UpdateName() } } } // 处理server回应的消息(直接显示到标准输出) func (client *Client) DealResponse() { // 一旦client.conn有数据就直接copy到stdout标准输出上,永久阻塞监听 io.Copy(os.Stdout, client.conn) } // 定义全局变量 var serverIp string // 定义全局变量 var serverPort int // init函数会在main函数之前执行 func init() { // ./client -ip 127.0.0.1 flag.StringVar(&serverIp, "ip", "127.0.0.1", "设置服务端IP地址(默认127.0.0.1)") // ./client -port 8888 flag.IntVar(&serverPort, "port", 8888, "设置服务端端口(默认8888)") } func main() { // 解析命令行传参 flag.Parse() client := NewClient(serverIp, serverPort) if client == nil { fmt.Println(">>>>>> 连接服务器失败!") return } fmt.Println(">>>>>> 连接服务器成功……") // 单独开启一个goroutine去处理server发送的消息 go client.DealResponse() // for { // time.Sleep(1 * time.Second) // } client.Run() }