首页 > 其他分享 >unigui显示websocket服务端向客户端发送信息【15】

unigui显示websocket服务端向客户端发送信息【15】

时间:2023-12-25 15:46:20浏览次数:40  
标签:HTTP unigui 端口 发送信息 WebSocket 应用程序 服务器 websocket 客户端

用WebSocket从服务端直接发送消息给all客户端。

1、在ServerModule 放TUniThreadTimer

 

2、timer event:

procedure TUniServerModule.UniThreadTimer1Timer(Sender: TObject);
begin
  BroadcastMessage('update',
                              [
                                'value', Random(1000)
                              ],
                  [boClientOnly]);
end;

一个名为update的消息被发送给所有现有的客户端,它带有一个名为value的参数,这个参数是一个介于0 ..999。定时器被调整为每秒发送一次消息。boClientOnly选项确保消息只在客户端处理,不会为此事件触发Ajax请求。
注意:参数调整:
BroadcastMessage('update', [ 'value', Random(1000) ]);
这将会通过每次更新都会为每个活动客户端生成一个Ajax事件(去掉第三步:client event):
procedure TMainForm.UniFormBroadcastMessage(const Sender: TComponent; const Msg: string; const Params: TUniStrings); begin if Msg = 'update' then UniLabel1.Caption := Params['value'].AsString; end;


3、在mainform的client event的ext:

 4、run:

你的unilabel不断更新数字。

5、用途:当你想用日期和时间等值重复更新客户端时,这很有用。这将消除持续发送Ajax请求并使服务器忙于处理它们的TUniTimer的使用。变通一下params.value是一数据结构字符串,将会有更多用途

6、默认情况下,WebSocket请求将使用与主HTTP服务器相同的IP地址和端口。例如,如果你的应用程序在8077端口上运行,那么将使用相同的端口来处理WebSocket请求。如果你的应用程序URL看起来像http://myserver.com:8077,那么WebSocket连接URL将是ws://myserver.com:8077。将使用同一个HTTP服务器处理HTTP和WebSocket请求。此场景适用于独立服务器和服务应用程序。在这些应用中,不需要绑定到不同的端口或IP地址,因为主HTTP服务器能够同时处理HTTP和WebSocket请求。

但是,如果您的应用程序部署为ISAPI或Apache模块,则模块中将没有内部HTTP服务器。外部web服务器(IIS、Apache等)运行自己的内部HTTP服务器。每个web服务器都使用自己专门的方法与websocket进行接口。有些应用程序(如IIS)使用专门的API,而其他应用程序则使用重写规则和代理技术来实现相同的目标。我们已经在这里详细讨论了IIS和Apache部署。

一般来说,当你的部署方法不是独立的服务器或服务(Windows或Linux)时,你应该选择不同的端口和/或IP地址来处理WebSocket请求。当您选择不同的端口或IP时,uniGUI将运行一个单独的HTTP服务器监听这个新端口。
如果您选择一个IP地址,这个服务器将绑定自己到该IP地址。所有WebSocket请求都会定向到这个专用的HTTP服务器。 配置不同的端口为了给websocket配置不同的端口,需要在应用中做一些设置。如果您的应用程序在超级服务器集群中运行,则此配置应在超级服务器配置文件中完成。 在application的ServerModule中找到WebSocketServer类属性。在这个类下有一个名为AuxPort的属性。AuxPort的默认值是0,这意味着websocket不会使用额外的端口。
非零值将强制uniGUI创建一个新的HTTP服务器,该服务器将在AuxPort上侦听传入的WebSocket请求。 例子: 如果您的web应用程序在端口8077上运行,并且AuxPort设置为8088,那么所有常规HTTP请求都将在端口8077上服务。您的应用程序URL将如预期的那样是http://myserver.com:8077。 在这个例子中,WebSocket请求将在端口8088上提供服务,这个URL将用于请求WebSocket连接:ws://myserver.com:8088。 在同一个示例中,如果您的应用程序是ISAPI(或Apache)模块,那么您的应用程序将使用其常规URL访问web应用程序,
如http://myserver.com/myapp.dll,但同样ws://myserver.com:8088将用于请求WebSocket连接。这意味着IIS或Apache将处理常规的HTTP调用,而内部HTTP服务器(侦听8088端口)将用于服务WebSocket请求。 辅助端口和防火墙注意事项: 当你配置一个不同的端口时,你需要确保这个辅助端口可以通过你的服务器防火墙或作为网络基础设施一部分的任何其他防火墙访问。
同样重要的是,任何试图访问您的web应用程序的客户端也应该能够访问这个额外的端口。例如,这个端口不应该被客户端网络上的防火墙阻止。 这个问题可以通过使用一个内部代理来解决,它将WebSocket调用(ws://globalurl)重定向到本地辅助端口(ws://localurl:aux_port)。
实现这一目标的方法对于每个web服务器都是不同的。主要是必须配置一个URL重写规则,将外部ws://请求重定向到运行在不同端口的内部WebSockets服务器。在这种情况下,全局端口将与应用程序主端口相同,但内部WebSockets服务器端口将不同。要实现这一点,你需要显式设置GlobalPort参数或为GlobalBinding属性设置一个值,包括正确的全局端口号。 配置不同的IP地址: 我们在上面提到过,当你为websocket子系统配置一个不同的端口时,你还应该确保这个端口在服务器端和客户端都没有被阻塞。
如果您的公司或客户端有限制网络规则,避免打开除80 (http)或443 (https)以外的任何端口,这可能会很困难。
在这种情况下,你可能需要在服务器上为WebSocket请求指定一个备用IP,而不是使用其他端口。在这种情况下,不需要更改端口号,因为这个备用IP将在主HTTP服务器的同一个端口上监听。 配置不同的IP需要服务器上有一个备用的全局IP。您需要调整一些参数来启用此功能。
第一个需要调整的参数是WebSocketServer类的Binding属性。这应该包含WebSockets HTTP服务器绑定的备用IP地址。
如果这个IP是一个全局IP地址,那么单独设置这个属性就足够了,否则,如果本地绑定IP与全局IP不同,那么您还必须为GlobalBinding属性设置一个值。例如,在某些网络中,使用路由器将全局IP地址重定向到内部服务器。在这种情况下,全局IP或URL可以与内部绑定IP地址不同。

标签:HTTP,unigui,端口,发送信息,WebSocket,应用程序,服务器,websocket,客户端
From: https://www.cnblogs.com/usegear/p/17926200.html

相关文章

  • ChatGPT对话为什么不用WebSocket而使用EventSource?
    文章目录1.引言2.WebSocket和EventSource简介2.1WebSocket2.2EventSource3.ChatGPT对话系统的特点4.EventSource的优势4.1简单易用4.2容错性强4.3兼容性良好5.为何选择EventSource而非WebSocket?5.1单向通信模式5.2长轮询模式5.3简化部署和维护6.使用EventSource的代......
  • uniGUI学习之表格和链接(76)
    拖一个UniHTMLFrame1到界面上<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><title>网页标题</title><basetarget="_blank"/></head>......
  • 用Python进行websocket接口测试
    我们在做接口测试时,除了常见的http接口,还有一种比较多见,就是socket接口,今天讲解下怎么用Python进行websocket接口测试。现在大多数用的都是websocket,那我们就先来安装一下websocket的安装包。pipinstallwebsocket-client 安装完之后,我们就开始我们的websocket之旅了。我们先来看......
  • websocket++
    一、介绍版本:WebSocket++(0.8.2)1、readme.md参照readme.mdWebSocket++是一个只有头文件(只有hpp文件)的c++库,它实现了RFC6455(WebSocket协议)。它允许将WebSocket客户端和服务端集成到c++程序中。它使用了可互换的网络传输模块,包括:基于原始字符缓冲区的模块基于c++的iostre......
  • WebSocket和Socket的区别
    区别总结协议不同Socket是基于传输层TCP协议的,而Websocket是基于HTTP协议的。Socket通信是通过Socket套接字来实现的,而Websocket通信是通过HTTP的握手过程实现的。持久化连接传统的Socket通信是基于短连接的,通信完成后即断开连接。Websocket将HTTP协议升......
  • uniGUI学习之禁用缓存(75)
    引用了第三方js,css等文件,但是因为缓存的原因,修改后没有及时生效。方法一:在ServerModule的OnHTTPCommand事件中,加入以下代码AResponseInfo.CacheControl:='max-age=0,no-cache,no-store,must-revalidate,proxy-revalidate';但是此方法有缺点,只支持exe模式,exe模式下所有......
  • uniGUI学习之自定义Hint(74)
    默认Hint样式 procedureTMainForm.UniFormShow(Sender:TObject);vari:Integer;beginfori:=0toSelf.ControlCount-1dobeginwithTUniFormControl(Self.Controls[i])dobeginifHint<>''thenbeginSh......
  • 使用JS和C#完成websocket双向通讯
    写在前面:微软官方对websocket的直接支持很差,教程也写得不用心。还要用户自己去转字节数组和字符串,太过分了!毕竟主推SignalR。本文是在官方教程的基础上,对其进行了一些简单的讲解,和方法提取、封装,以期降低学习难度。步骤描述:1、随便建了个普通的mvc项目(任意带控制器的.net项......
  • 使用js和nodejs完成websocket双向通讯
    如题。感谢AI。先用js完成一个最简单的例子。web端:html:<!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title><scriptsrc="j1.js"></script></head>......
  • unigui显示uniTreeVview使用TUniTreeNode内存泄漏的问题【14】
    uniTreeVviewc创建一个tree,显示患者姓名(PatientName)。因为需要用到患者ID(PatientID),所以使用help:TPatientTreeNode=class(TUniTreeNode)//strictprivateFPatientID:string;functionGetPatientID:string;procedureSetPatientID(constValue:string)......