从零开始:编写一个Web服务器---Sever端与Client端详解与代码实现

Sever端与Client端详解与代码实现

参考资料:《后台开发 核心技术与应用实践》《Linux高性能服务器编程》

Server端

Server端实现的功能很简单:调用http的解析,返回http的处理结果
当然这篇文章不牵扯线程池,IO,socket具体的使用,仅从业务逻辑上介绍Sever端应该做什么

在程序中,Server端会被封装成一个类。
在具体实现中,这个Server会new出http的对象,然后调用http的解析函数,当http解析完成后,delete掉对应的对象。

可以看出 Server起到的是调控,与接收输入,具体的解析Server是交给http部分来做(这个概念很重要!后面会唠到不同的模式)

Client端

因为我们做的是Web服务器,所以Client端会是浏览器,那么Client端的代码,完全不需要我们实现,可以使用任何一个浏览器。Client端的作用就是找到服务器,发起连接,发送请求包,接收结果并显示。

总结

目前为止,都是只讲解了整个服务器应该去做什么,没有涉及到的有:
如何建立连接,如何读取,如何处理多个连接,如何控制相同的请求等

如果你对我的文章感兴趣,欢迎阅读之后对于How to do的细节实现。

以下是一个使用ST语言编写的Twincat 3服务器的示例代码,该服务器可以与多个客户进行通信: ``` FUNCTION_BLOCK FB_Server VAR_INPUT Port: UINT; (* 服务器口 *) END_VAR VAR_OUTPUT ServerState: BOOL; (* 服务器状态 *) END_VAR VAR hServer: UDINT; (* 服务器句柄 *) hClient: UDINT; (* 客户句柄 *) bConnectedClients: ARRAY[1..10] OF BOOL; (* 连接的客户数量 *) nConnectedClients: UINT := 0; (* 连接的客户数量 *) sData: STRING; (* 接收的数据 *) nBytesReceived: UINT; (* 接收到的字节数 *) nBytesSent: UINT; (* 发送的字节数 *) bListening: BOOL := TRUE; (* 是否正在监听 *) bDataAvailable: BOOL; (* 是否有可用的数据 *) END_VAR (* 初始化服务器 *) hServer := SysSocketCreate(AF_INET, SOCK_STREAM, IPPROTO_TCP); IF hServer <> 0 THEN (* 绑定服务器口 *) IF SysSocketBind(hServer, INADDR_ANY, Port) = 0 THEN (* 监听连接请求 *) IF SysSocketListen(hServer, 10) = 0 THEN ServerState := TRUE; (* 等待客户连接 *) WHILE bListening DO hClient := SysSocketAccept(hServer); IF hClient <> 0 THEN (* 将新连接的客户添加到客户列表 *) nConnectedClients := nConnectedClients + 1; bConnectedClients[nConnectedClients] := TRUE; END_IF END_WHILE END_IF END_IF (* 关闭服务器 *) SysSocketClose(hServer); END_IF (* 接收数据 *) FOR i := 1 TO 10 DO IF bConnectedClients[i] THEN nBytesReceived := SysSocketReceive(hClient[i], sData, SIZEOF(sData)); IF nBytesReceived > 0 THEN bDataAvailable := TRUE; (* 处理接收到的数据 *) (* ... *) END_IF END_IF END_FOR (* 发送数据 *) IF bDataAvailable THEN FOR i := 1 TO 10 DO IF bConnectedClients[i] THEN nBytesSent := SysSocketSend(hClient[i], sData, SIZEOF(sData)); IF nBytesSent <= 0 THEN (* 客户连接已断开 *) bConnectedClients[i] := FALSE; nConnectedClients := nConnectedClients - 1; END_IF END_IF END_FOR END_IF ``` 需要注意的是,此示例代码仅用于演示Twincat 3如何实现服务器与多个客户之间的通信。实际应用中,需要根据具体的需求进行修改和完善。例如,可以添加更多的错误处理和安全机制,以确保服务器的稳定性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值