1. 客户端和服务器模型

- socket: BSD UNIX的进程通信机制,通常也称作“套排字”,用于描述IP地址和端口,是一个通信链的句柄。
- socket 可以理解为 TCP/IP 网络的API,它定义了许多函数,程序员可以使用它来开发TCPIP网络的应用程序。
- 计算机上运行对的应用程序通常通过“套接字"向网络发出请求或者应答网络请求。

- 服务端处理流程:
① 监听端口
② 接收客户端连接
③ 创建goroutine,处理此连接 - 客户端处理流程:
① 建立与服务端连接
② 进行数据收发
Apache是同步模型,Nginx是异步模型

2. 服务器端配置
一个服务端连接多个客户端,例如:世界各地的用户使用自己电脑的浏览器访问淘宝网。
示例:
package main
import (
"fmt"
"net"
)
//处理客户端连接请求
func process(coon net.Conn) {
defer coon.Close()
//定义接收信息的字节数组
var buf [1024]byte
//读取数据
n, err := coon.Read(buf[:])
if err != nil {
fmt.Println("获取信息失败,err:", err)
return
}
fmt.Printf("对方回复信息是:%s", string(buf[:n]))
}
//TCP服务端配置
func main() {
//1:启用监听
listener, err := net.Listen("tcp", "127.0.0.1:20000")
//连接失败处理
if err != nil {
fmt.Println("启动服务失败,err:", err)
return
}
//程序退出时释放端口
defer listener.Close()
for {
conn, err := listener.Accept() //2.建立连接
if err != nil {
fmt.Println("接收客户连接失败,err:", err)
continue
}
//3.启动一个人goroutine处理客户端连接
go process(conn)
}
}
3. 客户端配置
package main
import (
"fmt"
"net"
)
//TCP客户端
func main() {
//1:拨号方式建立与服务端连接
conn, err := net.Dial("tcp", "127.0.0.1:20000")
if err != nil {
fmt.Println("连接服务端失败,err:", err)
return
}
//注意:关闭连接位置,不能写在连接失败判断上面
defer conn.Close()
//2:向server发送信息
//fmt.Fprintln(conn,("hello,tom"))
_, err = conn.Write([]byte("hello,tom"))
if err != nil {
fmt.Println("发送信息失败,err:", err)
return
}
}
测试结果如下:
连接成功:


连接失败:

- 客户端优化聊天模式:
客户端
package main
import (
"bufio"
"fmt"
"net"
"os"
)
//TCP客户端
func main() {
//1:拨号方式建立与服务端连接
conn, err := net.Dial("tcp", "127.0.0.1:20000")
if err != nil {
fmt.Println("连接服务端失败,err:", err)
return
}
//注意:关闭连接位置,不能写在连接失败判断上面
defer conn.Close()
//控制台输入
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("控制台输入失败,err:", err)
return
}
//2:向server发送信息
//fmt.Fprintln(conn,("hello,tom"))
_, err = conn.Write([]byte(input))
if err != nil {
fmt.Println("发送信息失败,err:", err)
return
}
}
服务端
package main
import (
"fmt"
"net"
)
//处理客户端连接请求
func process(coon net.Conn) {
defer coon.Close()
//定义接收信息的字节数组
var buf [1024]byte
//读取数据
n, err := coon.Read(buf[:])
if err != nil {
fmt.Println("获取信息失败,err:", err)
return
}
fmt.Printf("对方回复信息是:%s", string(buf[:n]))
}
//TCP服务端配置
func main() {
//1:启用监听
listener, err := net.Listen("tcp", "127.0.0.1:20000")
//连接失败处理
if err != nil {
fmt.Println("启动服务失败,err:", err)
return
}
//程序退出时释放端口
defer listener.Close()
for {
conn, err := listener.Accept() //2.建立连接
if err != nil {
fmt.Println("接收客户连接失败,err:", err)
continue
}
//3.启动一个人goroutine处理客户端连接
go process(conn)
}
}
- 测试结果如下:


本文介绍了TCP通信的基础知识,包括客户端和服务器模型,以Go语言为例展示了服务器端如何监听端口、接收连接并处理客户端请求,以及客户端如何建立连接、发送数据。示例代码中包含了简单的客户端和服务器配置,以及客户端的聊天模式优化,实现了控制台输入与服务器的交互。

5138

被折叠的 条评论
为什么被折叠?



