网站后台模板,北京网络营销方案,电子商务网站建设与维护方法分析不包括哪些,seo排名优化技巧一、系统简介
这是一个基于udp协议的网络群聊系统#xff0c;为什么选择udp协议呢#xff1f;这就需要了解TCP协议与udp协议。
1#xff09;TCP#xff08;Transmission Control Protocol#xff0c;传输控制协议#xff09; 是面向连接的协议#xff0c;也就是说为什么选择udp协议呢这就需要了解TCP协议与udp协议。
1TCPTransmission Control Protocol传输控制协议 是面向连接的协议也就是说在收发数据前必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来其中的过程非常复杂只简单的描述下这三次对话的简单过程主机A向主机B发出连接请求数据包“我想给你发数据可以吗”这是第一次对话主机B向主机A发送同意连接和要求同步同步就是两台主机一个在发送一个在接收协调工作的数据包“可以你什么时候发”这是第二次对话主机A再发出一个数据包确认主机B的要求同步“我现在就发你接着吧”这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步经过三次“对话”之后主机A才向主机B正式发送数据。 2UDPUser Data Protocol用户数据报协议 1 UDP是一个非连接的协议传输数据之前源端和终端不建立连接当它想传送时就简单地去抓取来自应用程序的数据并尽可能快地把它扔到网络上。在发送端UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制在接收端UDP把每个消息段放在队列中应用程序每次从队列中读一个消息段。 2 由于传输数据不建立连接因此也就不需要维护连接状态包括收发状态等因此一台服务机可同时向多个客户机传输相同的消息。 3 UDP信息包的标题很短只有8个字节相对于TCP的20个字节信息包的额外开销很小。 4 吞吐量不受拥挤控制算法的调节只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。 5UDP使用尽最大努力交付即不保证可靠交付因此主机不需要维持复杂的链接状态表这里面有许多参数。 6UDP是面向报文的。发送方的UDP对应用程序交下来的报文在添加首部后就向下交付给IP层。既不拆分也不合并而是保留这些报文的边界因此应用程序需要选择合适的报文大小。 我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常其实“ping”命令的原理就是向对方主机发送UDP数据包然后对方主机确认收 到数据包 如果数据包是否到达的消息及时反馈回来那么网络就是通的。 本系统就是基于udp协议的实现简单的群聊分为服务器端和客户端两大部分服务器端既可以从网络中接收客户端发送的消息存入数据池环形 队列实现也可以从数据池获取数据发送给在线的客户。 二、系统框架 client模块:畅聊系统client上层逻辑提供client底层通信 server模块畅聊系统server上层逻辑提供server底层通信 comm模块畅聊系统底层公共逻辑如数据序列化。 data_pool模块数据池的实现 window模块client窗口模块 lib第三⽅方库模块提供第三⽅方库模块 conf模块提供server的配置文件 plug插件起停服务脚本模块起停服务脚本 三、功能模块
1、服务器 2、客户端 3、界面 4、数据池 5、数据处理 6、编译makefile ROOT$(shell pwd)
SERVER$(ROOT)/server
CLIENT$(ROOT)/client
LOG$(ROOT)/log
POOL$(ROOT)/data_pool
COMM$(ROOT)/comm
LIB$(ROOT)/lib
WINDOW$(ROOT)/window
CONF$(ROOT)/conf
PLUGIN$(ROOT)/pluginSERVER_BINchat_system
CLIENT_BINchat_clientINCLUDE-I$(POOL) -I$(LOG) -I$(COMM) -I$(LIB)/include -I$(WINDOW)
LDFLAGS -L$(LIB)/lib -lpthread -ljson -lncurses SERVER_OBJ$(shell ls $(SERVER) | grep -E \.cpp$$ | sed s/\.cpp/\.o/)
SERVER_OBJ$(shell ls $(LOG) | grep -E \.cpp$$ | sed s/\.cpp/\.o/)
SERVER_OBJ$(shell ls $(POOL) | grep -E \.cpp$$ | sed s/\.cpp/\.o/)
SERVER_OBJ$(shell ls $(COMM) | grep -E \.cpp$$ | sed s/\.cpp/\.o/)
CLIENT_OBJ$(shell ls $(CLIENT) | grep -E \.cpp$$ | sed s/\.cpp/\.o/g)
CLIENT_OBJ$(shell ls $(LOG) | grep -E \.cpp$$ | sed s/\.cpp/\.o/)
CLIENT_OBJ$(shell ls $(COMM) | grep -E \.cpp$$ | sed s/\.cpp/\.o/)
CLIENT_OBJ$(shell ls $(WINDOW) | grep -E \.cpp$$ | sed s/\.cpp/\.o/)CCg.PHONY:all
all:$(SERVER_BIN) $(CLIENT_BIN)$(SERVER_BIN):$(SERVER_OBJ)$(CC) -o $ $^ $(LDFLAGS)echo linking [$^] to [$] .....done
$(CLIENT_BIN):$(CLIENT_OBJ) $(CC) -o $ $^ $(LDFLAGS) echo linking [$^] to [$] .....done%.o:$(CLIENT)/%.cpp$(CC) -c $ $(INCLUDE)echo comping [$^] to [$] ... done
%.o:$(SERVER)/%.cpp$(CC) -c $ $(INCLUDE)echo comping [$^] to [$] ... done
%.o:$(POOL)/%.cpp$(CC) -c $ echo comping [$^] to [$] ... done
%.o:$(LOG)/%.cpp$(CC) -c $ echo comping [$^] to [$] ... done
%.o:$(COMM)/%.cpp$(CC) -c $ $(INCLUDE)echo comping [$^] to [$] ... done
%.o:$(WINDOW)/%.cpp$(CC) -c $ $(INCLUDE)echo comping [$^] to [$] ... done.PHONY:debug
debug:echo $(SERVER_OBJ)echo $(CLIENT_OBJ)
.PHONY:output
output:mkdir -p output/servermkdir -p output/clientmkdir -p output/server/logcp $(SERVER_BIN) output/servercp $(CLIENT_BIN) output/clientcp $(PLUGIN)/ctl_server.sh output/servercp -rf $(CONF) output/server
.PHONY:clean
clean:rm -rf *.o $(SERVER_BIN) $(CLIENT_BIN) output四、基本成果比较简陋持续更新中-------------- 五、源码
网络群聊系统