unigui显示websocket服务端向客户端发送信息【15】
用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地址不同。