1.开发语言:GO语言
2.IDE:Goland
3.开发用时:一个小时
4.源码已上传到我的GitHub,链接:https://github.com/2394799692/TCP-C-S 或点此跳转
这只是一个一对一版本的,下午把并发服务器与客户端的代码更新出来。
以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj。QQ:2394799692
一、项目开发日志服务器端:
1.创建监听socket listener:=net.Listen("TCP","IP+port") IP+PORT——服务器自己的IP和port
2.启动监听 conn:=listener.Accept{} conn 用于通信的socket
3.conn.Read
4.处理使用 数据
5.conn.Write()
6.关闭 listener,conn
客户端:
1.conn,err:=net.dial("tcp",服务器的ip+port)
2.写数据给服务器conn.write()
3.读取服务器回发的数据 conn.read()
4.conn.close()
二、前情知识补充
1.网络应用设计模式
1)C/S模式:
传统的网络应用设计模式,客户机cloent/服务器server模式。需要在通讯两端各自部署客户机和服务器来完成数据通信。
2)B/S模式:
浏览器browser/服务器server模式。只需要在一端部署服务器,另一端使用每台PC都默认配置的浏览器即可完成数据的传输。
2.TCP的C/S架构优缺点:
1.C/S模式的数据传输效率高,服务器与客户端所采用的协议比较灵活,但工作量比较大,用户也需要安装客户端。
2,B/S模式的开发量小,只用开发服务器端,移植性好,缺点是协议单一,缓存数据慢
这两个图一定要弄懂,是理解TCP服务器与客户端实现代码的关键
3.TCP通信过程三、服务器端代码展示三次握手:
1.主动发起请求端,发送SYN
2.被动建立连接请求端,应答ACK同时发送SYN
3.主动发起请求端,发送应答ACK
标志TCP三次握手建立完成。
——server:Accept()返回。
——client:Dial()返回。
四次挥手:
1.主动关闭连接请求端,发送FIN
2.被动关闭连接请求端,应答ACK
(标志半关闭完成——close())
3.被动关闭连接请求端,发送FIN
4.主动关闭连接请求端,应答ACK
(标志。四次挥手建立完成——close())
package main
import (
"fmt"
"net"
)
func main() {
//指定服务器 通信协议 IP地址 port .创建一个用于监听的套接字:listen
listener, err := net.Listen("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("net.Listen err:", err)
return
}
//关闭服务
defer listener.Close()
fmt.Println("服务器等待客户端建立连接...")
//阻塞监听客户端连接请求,成功建立连接,返回用于通信的socket
conn, err := listener.Accept()
if err != nil {
fmt.Println("listener.accept err:", err)
return
}
defer conn.Close() //关闭服务
fmt.Println("服务器与客户端成功建立连接!!!")
// 读取客户端发送的数据
buf := make([]byte, 4096) //定义一个切片,4096字节
n, err := conn.Read(buf)
if err != nil {
fmt.Println("conn.Read err:", err)
return
}
conn.Write(buf[:n]) //读多少写多少。原封不动
//处理数据————打印
fmt.Println("服务器读到数据:", string(buf[:n]))
}
四、客户端代码展示
package main
import (
"fmt"
"net"
)
func main() {
//指定服务器 ip+port创建通信套接字
conn, err := net.Dial("tcp", "127.0.0.1:8000")
if err != nil {
fmt.Println("net.dial err:", err)
return
}
defer conn.Close()
//主动写数据给服务器
conn.Write([]byte("are you ready?"))
buf := make([]byte, 4096)
//接收服务器回发的数据
n, err := conn.Read(buf)
if err != nil {
fmt.Println("conn.Read err:", err)
return
}
//处理数据,打印
fmt.Println("服务器回发:", string(buf[:n])) //读了多少显示多少
}
五、效果展示:
1)启动服务器端,显示等待客户端建立连接:
2)通过nc命令访问服务器端设置的ip+port实现客户端访问服务器:
3)客户端发送数据,服务器端收到数据并输出然后将数据写回客户端:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)