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

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架构

【GO语言】实现TCP—C/S设计模式的服务器server端与客户client端即时通信_第1张图片

这两个图一定要弄懂,是理解TCP服务器与客户端实现代码的关键【GO语言】实现TCP—C/S设计模式的服务器server端与客户client端即时通信_第2张图片

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)启动服务器端,显示等待客户端建立连接:
【GO语言】实现TCP—C/S设计模式的服务器server端与客户client端即时通信_第3张图片

2)通过nc命令访问服务器端设置的ip+port实现客户端访问服务器:
【GO语言】实现TCP—C/S设计模式的服务器server端与客户client端即时通信_第4张图片

3)客户端发送数据,服务器端收到数据并输出然后将数据写回客户端:
【GO语言】实现TCP—C/S设计模式的服务器server端与客户client端即时通信_第5张图片

你可能感兴趣的:(练习项目,服务器,golang,tcp/ip,go语言,设计模式)