```
//server.go
package main
import (
"fmt"
"io"
"net"
)
func process(conn net.Conn) {
defer conn.Close() //关闭connect
for {
//创建一个新的切片
buf := make([]byte, 1024)
//1.等待客户端通过conn发送信息
//2.如果客户端没有write\[发送\],那么协程就阻塞在此处
fmt.Println("服务器在等待客户端的输入", conn.RemoteAddr().String())
n, err := conn.Read(buf) //n是字节长度
if err == io.EOF {
fmt.Println("客户端退出")
return
}
if err != nil {
fmt.Println("服务器的read err=", err)
return
}
fmt.Println("n=", n)
//3.显示客户端发送的内容在服务器的终端
fmt.Print(string(buf[:n]))
}
}
func main() {
fmt.Println("服务器开始监听......")
//127.0.0.1->ipv4 0.0.0.0->ipv4和ipv6 或者:port,省略ip
listen, err := net.Listen("tcp", "0.0.0.0:8899")
if err != nil {
fmt.Println("listen err=", err)
return
}
defer listen.Close() //延时关闭listen
//循环等待客户端
for {
fmt.Println("等待客户端连接......")
conn, err := listen.Accept()
if err != nil {
fmt.Println("accpet() error=", err)
continue
}
fmt.Printf("accpet =%v ip=%v\\n", conn, conn.RemoteAddr())
go process(conn)
}
//fmt.Printf("listen =%v\\n", listen)
}
```
```
//client.go
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8899")
if err != nil {
fmt.Println("client dial err=", err)
return
}
fmt.Println("conn succ=", conn)
reader := bufio.NewReader(os.Stdin) //代表标准输入\[终端\]
//从终端读取一行用户输入,并准备发送给服务器
str, err := reader.ReadString('\\n')
if err != nil {
fmt.Println("read string err=", err)
return
}
//再将line发送给服务器
n, err := conn.Write(\[\]byte(str))
if err != nil {
fmt.Println("conn.write err=", err)
return
}
fmt.Printf("客户端发送了 %d 字节的数据,并推出", n)
}
```
- 数据类型
- 数组array
- 切片slice
- 字符串string
- map
- 结构体struct
- 方法func
- 匿名结构体(继承)
- 字段别名
- 接口interface
- 常量
- 基础语法
- 循环for
- 遍历
- 函数func
- defer
- 异常处理error
- 访问范围
- 包
- 类型断言
- 文件
- 打开文件
- 读取文件
- 写文件
- 判断是否存在
- 拷贝文件
- JSON
- 序列化
- 反序列化
- 命令行
- 杂项
- Windows下配置加速
- 相关链接
- 占位符
- 随机数rand
- 单元测试
- goroutine
- 并发和并行
- 协程和主线程
- MPG模式
- 设置CPU数量
- 全局互斥锁
- 管道
- 示例1
- 示例2
- select
- 异常捕获
- 反射
- 示例
- 示例-改变值
- 网络编程
- TCP编程
- 示例一
- redis