1、网络编程
1.1、网络编程基本介绍
1.2、OSI与Tcp/Ip参考模型
1.3、Ip地址
1.4、端口(port)介绍
1.4.1、端口分类
1.4.2、端口(port)使用注意
1.5、tcp socket编程的客户端和服务器端
2、tcp socket编程快速入门
2.1、服务端的处理流程
2.2、客户端的处理流程
2.3、简单的程序示意图
2.4、代码实现
package main
import (
"fmt"
"net"
)
/**
* @Description:网络编程 编写服务端,在8888端口端口监听 可以和多个客户端建议链接
* @Author: guai
* @Date:2020/2/27 21:55
**/
//服务端
func process(conn net.Conn) {
//采用延迟机制关闭conn连接
defer conn.Close()
for {
//创建一个切片
buf := make([]byte, 1024)
//1、等待客户端通过conn连接发送消息
//2、如果客户端没有 write【发送】,那么协程就会阻塞在这里
fmt.Println("waiting for client messages")
//从conn中读取 客户端发送的值
n, err := conn.Read(buf)
if err != nil {
fmt.Println("client exist err:", err)
return
}
//3、显示客户端发送的内容到服务器的终端 (控制台)
fmt.Println("client message:", string(buf[:n]))
}
}
func main() {
fmt.Println("服务器开始监听")
//1、tcp表示网络协议是tcp
//2、0.0.0.0:8888 表示在本地监听8888端口
listen, err := net.Listen("tcp", "0.0.0.0:8888")
if err != nil {
fmt.Println("listen err:", err)
return
}
//采用延迟机制关闭 jianting
defer listen.Close()
//循环等待客户端来连接
for {
//等待客户端连接
fmt.Println("waitin connect")
conn, err := listen.Accept()
if err != nil {
fmt.Println("Accept() err=", err)
} else {
fmt.Printf("accept() suc con=%v 客户端ip=%v\n", conn, conn.RemoteAddr().String())
}
//准备一个协程为客户端服务
go process(conn)
}
}
运行结果:
package main
import (
"bufio"
"fmt"
"net"
"os"
)
/**
* @Description: 编写一个客户端与服务端连接并通信
* @Author: guai
* @Date:2020/2/27 22:12
**/
func main() {
//拨号 与指定ip的指定端口连接
conn, err := net.Dial("tcp", "192.168.43.52:8888")
if err != nil {
fmt.Println("client dial err:", err)
return
}
fmt.Printf("connect %v success! plase input message:",conn.RemoteAddr())
//功能一:客户端发送单行数据,然后退出
//os.Stdin 表示标准输入【终端】
reader := bufio.NewReader(os.Stdin)
//从终端读取一行用户输入 并准备发送给服务器
line, err := reader.ReadString('\n')
if err != nil {
fmt.Println("readString err:", err)
}
n, err := conn.Write([]byte(line))
if err != nil {
fmt.Println("conn.Writer err:", err)
}
fmt.Println("客户端发送了", n, "字节数据并退出")
}
结果:
客户端:
服务端:
2.4.1、升级客户端 客户端可发送多条消息当输入exit退出
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
/**
* @Description:可以发送多条信息的客户端 并通过输入exit退出
* @Author: guai
* @Date:2020/2/27 22:52
**/
func main() {
//拨号与 指定ip的端口建立连接
con, err := net.Dial("tcp", "0.0.0.0:8888")
if err != nil {
fmt.Println("connect fail err:", err)
return
}
fmt.Printf("contect with %v,please input:(if input 'exit' will exit)\n", con.RemoteAddr())
//创建标准输入流 os.Stdin表示从终端(控制台输入)
reader := bufio.NewReader(os.Stdin)
for {
//获取从控制台输入的数据以回车结束
line, err := reader.ReadString('\n')
line = strings.Trim(line, "\r\n")
if err != nil {
fmt.Println("read err:", err)
}
if line == "exit" {
break
}
n, err := con.Write([]byte(line))
if err != nil {
fmt.Println("conn write err:", err)
} else {
fmt.Printf("send %d bytes success\n", n)
}
}
fmt.Println("exit")
}
结果:
客户端:
服务端:
部分图片来自 Go语言-尚硅谷_韩顺平_Go语言核心编程.pdf 如需我删除,可以留言或者私聊哟
磕头ing