欢迎光临散文网 会员登陆 & 注册

Go语言网络编程、TCP(海量用户即时通讯系统)

2022-11-05 21:36 作者:苦茶今天断更了吗  | 我要投稿

Go语言网络编程、TCP

网络编程有两种:

①TCP socket编程,是网络编程的主流。底层是基于Tcp/ip 协议的。如: QQ聊天

②B/S结构的http编程,http底层依旧是用tcp socket实现的如:京东商城

 

TCP/IP(Transmission Control Protocol/Internet Protocol)

传输控制协议/因特网互联协议,又叫网络通讯协议

是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成的。

OSI与TCP/IP参考模型 (推荐TCP/IP协议3卷)

IP地址

每个internet上的主机和路由器都有一个ip地址,它包括网络号和主机号,ip 地址有ipv4(32位)、ipv6(128 位)。

可以通过ipconfig来查看。

 

端口(port)

TCP/IP 协议中的端口,是逻辑意义上的端口。

如果把IP地址比作一间房子,端口就是出入这间房子的门。

一个IP地址的端口可以有65536(256×256)个,端口是通过端口号来标记的,整数,范围是从0到65535(256×256-1)

分类:

0:保留端口;

1~1024:固定端口,又叫有名端口,即被某些程序固定使用,一般程序员不使用。

22: SSH 远程登录协议   23: telnet使用   21: ftp 使用

25: smtp 服务使用   80: iis 使用  7: echo 服务

1025~65535 :动态端口,程序员可使用。

使用注意:

①在计算机(尤其是做服务器)要尽可能的少开端口

②一个端口只能被一个程序监听

③使用 netstat–an,可查看本机有哪些端口在监听

④使用 netstat–anb ,可查看监听端口的pid,在结合任务管理器关闭不安全的端口

 

bufio包实现了有缓冲的I/O。

net包提供了可移植的网络I/O接口,包括TCP/IP、UDP、域名解析和Unix域socket。

大部分只需要Dial、Listen和Accept函数提供的基本接口;以及相关的Conn和Listener接口。

 

Dial函数和服务端建立连接:

conn, err := net.Dial("tcp", "google.com:80")

status, err := bufio.NewReader(conn).ReadString('\n')

 

Listen函数创建的服务端:

ln, err := net.Listen("tcp", ":8080")

if err != nil {…}

for {

conn, err := ln.Accept()

if err != nil {

// handle error

continue

}

go handleConnection(conn)

}


tcp socket编程的客户端和服务器端

Golang socket编程中客户端和服务器的网络分布

 

tcp socket编程的快速入门

服务端的处理流程:

①监听端口8888

②接收客户端的tcp链接,建立客户端和服务器端的链接

③创建goroutine,处理该链接的请求(通常客户端会通过链接发送请求包)

客户端的处理流程:

①建立与服务端的链接

②发送请求数据【终端】,接收服务器端返回的结果数据

③关闭链接

代码的实现:以下是用到的函数:

func (c *TCPConn) RemoteAddr() Addr:emoteAddr返回远端网络地址

 

type Listener interface {

Addr() Addr    // Addr返回该接口的网络地址

Accept() (c Conn, err error)  // Accept等待并返回下一个连接到该接口的连接

Close() error    // Close关闭该接口,并使任何阻塞的Accept操作都会不再阻塞并返回错误。

}

Listener是一个用于面向流的网络协议的公用的网络监听器接口。多个线程可能会同时调用一个Listener方法。

 

func (b *Reader) ReadString(delim byte) (line string, err error)

ReadString读取直到第一次遇到delim字节,返回一个包含已读取的数据和delim字节的字符串。

如果在读取到delim之前遇到了错误,它会返回在错误之前读取的数据以及该错误(一般是io.EOF)。

当且仅当ReadString方法返回的切片不以delim结尾时,会返回一个非nil的错误。

 

服务器端功能:

 

客户端功能:


 海量用户即时通讯系统:

项目要保存用户信息和消息数据,需要学习数据库(Redis或Mysql) 。如何在Golang中使用Redis。

完成用户登录:

先完成指定用户的验证,这里先说明一个Message的组成,并发送一个Message的流程。

 


思路分析:

①让客户端发送消息本身。

②服务器端接受到消息, 然后反序列化成对应的消息结构体。

③服务器端根据反序列化成对应的消息, 判断是否登录用户是合法,返回LoginResMes。

④客户端解析返回的 LoginResMes,显示对应界面。

这里需要做函数的封装

 

在Redis手动添加测试用户,并画图+说明注意。

完成登录时能返回当前在线用户:

完成登录用可以群聊:

 

 

 

 


Go语言网络编程、TCP(海量用户即时通讯系统)的评论 (共 条)

分享到微博请遵守国家法律