```
//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