Go语言网络编程、TCP(海量用户即时通讯系统)
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手动添加测试用户,并画图+说明注意。
完成登录时能返回当前在线用户:

完成登录用可以群聊:


