client/main.go
// Go语言·网络编程
package main
import (
"net"
"fmt"
"bufio"
"os"
"strings"
)
var content string = `
————————————————Go语言·网络编程————————————————————
一、TCP编程
客户端:
建立与服务端的连接
发送请求数据[终端],接收服务器端返回 的结果数据
关闭连接
`
func main() {
conn,err := net.Dial("tcp","0.0.0.0:8888")
if err != nil {
fmt.Println("Conn Failed...",err)
return
}
fmt.Println("Conn Succ=",conn)
reader := bufio.NewReader(os.Stdin)
for {
line,err := reader.ReadString('\n')
if err != nil {
fmt.Println("reader Failed...",err)
}
if strings.Trim(line, "\r\n") == "exit" {
fmt.Println("客户端退出咯...")
break
}
_,err = conn.Write([]byte(line))
if err != nil {
fmt.Println("conn.Write Failed...",err)
}
}
}
server/main.go
// Go语言·网络编程
package main
import (
"net"
"fmt"
"io"
)
var content string = `
————————————————Go语言·网络编程————————————————————
一、TCP编程
服务端:
监听端口 8888
接收客户端tcp链接,建立客户端和服务器端的连接
创建goroutine,处理该连接的请求(通常客户端会通过连接发送请求包)
`
func process(conn net.Conn){
// 关闭
defer conn.Close()
// 循环接收客户端发送的数据
for {
buffer := make([]byte,1024)
// 从连接conn中读取
// 1.等待客户端通过conn发送信息,conn.Write
// 2.如果客户端没有conn.Write[发送信息],那么
// 协程就阻塞在这里
// fmt.Printf("等待客户端发送消息,客户端的ip=%v \n",conn.RemoteAddr().String())
n,err := conn.Read(buffer)
if err != nil || err == io.EOF {
// fmt.Println("服务器端口,读取失败:",err)
return
}
fmt.Print(string(buffer[:n]))
}
}
func main() {
fmt.Println("服务端,监听中...")
// 1.网络协议Tcp
// 2.在本地监听端口:8888
listen,err := net.Listen("tcp","0.0.0.0:8888")
if err != nil {
fmt.Println("服务端,监听失败...",err)
return
}
// 延时关闭listen
defer listen.Close()
// 循环等待客户端连接
for {
//等待客户端连接
fmt.Println("等待客户端连接...")
conn,err := listen.Accept()
if err != nil {
fmt.Println("Accept() 连接失败...",err)
}else{
fmt.Printf("Accept() 连接成功=%v 客户端的ip=%v \n",conn,conn.RemoteAddr().String())
}
// 启用协程,为客户端服务
go process(conn)
}
fmt.Printf("listen suc = %v \n",listen)
}