Socket通信和MQ通信
一、Socket通信
Socket 是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在用户进程与TCP/IP协议之间充当中间人,完成TCP/IP协议的书写。
1. Socket API
(1)Socket() 创建 socket 描述符
int socket(int domain,int type,int protocol)
(//返回值:成功则为0,失败为-1)
domain:协议域,又称协议族(family),决定了socket的地址类型,在通信中必须采用对应的地址。
type:信息传送方式。
protocol:对应协议。通常设置为0,让其自动匹配。
(domain 网络层相关协议,type 信息传送方式,protocol 运输层相关协议)
(2)bind() 绑定实际地址
int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
(//返回值:成功则为0,失败为-1)
sockfd 一般服务端才需要绑定,客户端由系统内核解决
addr 所有协议都有一个公共的结构叫做const struct sockaddr
,不同协议对应不同的具体结构,结构如下:
struct sockaddr
{ sa_family_t sin_family; //地址族
char sa_data[14]; //14字节,包含套接字中的目标地址和端口信息 };
例如:ipv4结构体
struct sockaddr_in {
sa_family_t sin_family;
in_port_t sin_port; //typedef __uint16_t in_port_t;
struct in_addr sin_addr;
};
struct in_addr {
uint32_t s_addr;
};
addrlen:协议结构体大小,通常使用sizeof运算符计算
sizeof(sockaddr_in); //IPv4 in:internet
(3)listen()、connect() 主机监听、从机连接
int listen(int sockfd,int backlog); //返回值:成功则为0,失败为-1
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); //返回值:成功则为0,失败为-1
listen决定需要开启的服务,connect拨打电话。
listen函数的 第一个参数即为要监听的socket描述字,
第二个参数为相应socket可以排队的最大连接个数。
socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。
connect函数的
第一个参数即为客户端的socket描述字,
第二参数为服务器的socket地址,
第三个参数为socket地址的长度。
客户端通过调用connect函数来建立与TCP服务器的连接。
(4)accept建立连接
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //返回值:成功则为0,失败为-1
第一个参数为服务器的socket描述字
第二个参数为指向struct sockaddr *的指针,用于返回客户端的协议地址
第三个参数为协议地址的长度
如果accpet成功,那么其返回值是由内核自动生成的一个全新的描述字,代表与返回客户的TCP连接。后面的读写操作都是根据这个返回值来完成的。
(5)read和write函数
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
(6)close关闭服务
int close(int fd); //返回值:成功则为0,失败为-1
2. socket中TCP的三次握手建立连接
客户端的connect在三次握手的第二个次返回,而服务器端的accept在三次握手的第三次返回。
3. socket中TCP的四次握手释放连接
二、MQ通信
MQ( Message Queue(消息队列)),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。(先进先出的数据结构)
生产者将消息发送给MQ。 MQ将消息推送给指定消费者,或者消费者去MQ获取特定的消息。
生产者和消费者又可以成为客户端,相对应MQ就是服务端。
- 把数据放到消息队列叫做生产者
- 从消息队列里边取数据叫做消费者
MQ中有broker的
broker可以理解为是一个中转站。生产者将消息发送给他就结束自己的任务了,broker将消息主动推送给消费者(具体的将消息推送到哪个队列,或者说消费者主动请求)
MQ中无broker的
直接使用socket进行通信。
socket主要用于即时通讯。socket是长连接。
传统的http请求随着服务端返回给客户端消息,两者之间的关联就消失了,所以服务端想要主动练习客户端就得靠轮询的方式,但是这种轮询比较耗费性能,既耗费客户端的性能,又耗费服务器资源,于是就有了长连接的概念。
小注:
客户端和服务器端使用socket通信,类似两方在打电话的过程,互相获取信息数据,电话挂断,则通信结束。
后将获取到的信息上传到mq中,让消费者来取。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY