【GO语言】实现TCP—CS设计模式的服务器server端与客户client端即时通信

【GO语言】实现TCP—CS设计模式的服务器server端与客户client端即时通信,第1张

GO语言实现TCP—C/S设计模式的服务器server端与客户client端通信 项目总览:一、项目开发日志二、前情知识补充1.网络应用设计模式2.TCP的C/S架构3.TCP通信过程 三、服务器端代码展示四、客户端代码展示五、效果展示:

项目总览:

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都默认配置的浏览器即可完成数据的传输。

优缺点:
1.C/S模式的数据传输效率高,服务器与客户端所采用的协议比较灵活,但工作量比较大,用户也需要安装客户端。
2,B/S模式的开发量小,只用开发服务器端,移植性好,缺点是协议单一,缓存数据慢

2.TCP的C/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)客户端发送数据,服务器端收到数据并输出然后将数据写回客户端:

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/990835.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存