Press "Enter" to skip to content

TCP网络编程(1)

目前实现了多个客户端给服务端发送消息

// server.go

package main

import (
	"fmt"
	"io"
	"net"
)

// 客户端连接直接扔协程中
func process(conn net.Conn) {
	// 关闭连接
	defer conn.Close()

	for {
		//接收客户端的消息
		buf := make([]byte, 1024) // 创建一个切片来接收客户端的消息
		n, err := conn.Read(buf)
		// 这个就是客户端断开连接了
		if err == io.EOF {
			fmt.Println(conn.RemoteAddr(), "客户端已断开连接.")
			return
		}
		if err != nil {
			fmt.Println("服务器接收消息失败: ", err)
			continue
		}
		// 打印消息
		fmt.Printf("收到消息:%v\n", string(buf[:n]))
	}
}

func main() {
	fmt.Println("等待客户端连接...")
	listener, err := net.Listen("tcp", "0.0.0.0:8899")
	if err != nil {
		fmt.Println("服务器启动失败", err)
		return
	}
	defer listener.Close()
	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("连接失败: ", err)
			continue
		}
		fmt.Printf("客户端连接成功,IP地址为: %v\n", conn.RemoteAddr())
		// 连接扔到协程中去
		go process(conn)
	}
}
// client.go

package main

import (
	"bufio"
	"fmt"
	"net"
	"os"
	"strings"
)

func main() {
	conn, err := net.Dial("tcp", "127.0.0.1:8899")
	if err != nil {
		fmt.Println("连接服务器失败")
		return
	}
	fmt.Println("已成功连接服务器: ", conn.RemoteAddr())

	// 从标准输入接收内容
	reader := bufio.NewReader(os.Stdin)

	for {
		// 读取终端的输入的数据
		str, _ := reader.ReadString('\n')
		// 处理收到的消息
		str = strings.Trim(str, "\r\n")
		if str == "" {
			fmt.Print("消息不能为空")
			continue
		}
		// 判断是否为exit,如果是则退出
		if str == "exit" {
			fmt.Println("您已退出客户端")
			break
		}
		// 发送数据到服务器
		_, err = conn.Write([]byte(str))
		if err != nil {
			fmt.Println("发送消息失败")
		}
	}
}

One Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注