Foxtable(狐表)用户栏目专家坐堂 → [求助]已知Websocket服务器地址,请教如何在FOX端接收并保存接受的数据


  共有2517人关注过本帖树形打印复制链接

主题:[求助]已知Websocket服务器地址,请教如何在FOX端接收并保存接受的数据

帅哥,在线噢!
WELOVEFOX
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:463 积分:3343 威望:0 精华:0 注册:2016/12/21 22:58:00
[求助]已知Websocket服务器地址,请教如何在FOX端接收并保存接受的数据  发帖心情 Post By:2023/3/9 17:22:00 [显示全部帖子]

向各位大佬及蓝板请教下:已知Websocket服务器地址,请教如何在FOX端接收并保存接受的数据。

再细细说明下:不是说在FOX中建立Websocket服务器,而是说:已经有存在的其它正常运行的Websocket服务器,有明确的WS地址及端口.

希望:
1.FOX端中制作客户端与这个WS服务器建立连接。

2.接收服务器发送的信息,并保存。(这个应该都是JSON的东西,只要FOX能获取,用FOX拆分成数组保存到FOX中的表或数据库中)

如果FOX能做到,代码方面要注意的地方及如何处理(我看了html代码目前所想到的):
1.如判断服务器正常运行,握手成功,再接收信息。
2.如果服务器断线,重新握手接收信息。
3.接收信息是持续的,是不是要采用异步函数之类的,防止FOX客户端不能其它操作。

查了下坛里面的帖子,也好少这方面的知识,因为CS编程基础及BS基础都比较薄弱,百度了好久,C#或有现成的github上有其它人现成的DLL,不会引用使用。

而HTML端的代码找到,并扒了下来,也能正常运行,如果将这个静态HTML模板改写成FOXWEB端,水平真的不足,估计还要学好久。
网上找javascript转VB.NET没找到。


HTML端的示例


此主题相关图片如下:snipaste_2023-03-09_17-12-35.jpg
按此在新窗口浏览图片

以下内容为程序代码:

1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2 <html>
3 <head>
4 <title>websocket client</title>
5 <script type="text/javascript">
6 var start = function () {
7 var inc = document.getElementById('incomming');
8 var wsImpl = window.WebSocket || window.MozWebSocket;
9 var form = document.getElementById('sendForm');
10 var input = document.getElementById('sendText');
11
12 inc.innerHTML += "connecting to server ..<br/>";
13
14 // create a new websocket and connect
15 window.ws = new wsImpl('ws://127.0.0.1:777/');
16
17 // when data is comming from the server, this metod is called
18 ws.onmessage = function (evt) {
19 inc.innerHTML += evt.data + '<br/>';
20 };
21
22 // when the connection is established, this method is called
23 ws.onopen = function () {
24 inc.innerHTML += '.. connection open<br/>';
25 };
26
27 // when the connection is closed, this method is called
28 ws.onclose = function () {
29 inc.innerHTML += '.. connection closed<br/>';
30 }
31
32 form.addEventListener('submit', function (e) {
33 e.preventDefault();
34 var val = input.value;
35 ws.send(val);
36 input.value = "";
37 });
38
39 }
40 window.onload = start;
41 </script>
42 </head>
43 <body>
44 <form id="sendForm">
45 <input id="sendText" placeholder="Text to send" />
46 </form>
47 <pre id="incomming"></pre>
48 </body>
49 </html>



谢谢阅读。

[此贴子已经被作者于2023/3/10 21:10:20编辑过]

 回到顶部
帅哥,在线噢!
WELOVEFOX
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:463 积分:3343 威望:0 精华:0 注册:2016/12/21 22:58:00
  发帖心情 Post By:2023/3/9 17:34:00 [显示全部帖子]

  我看过那个帖子里,放在FOX里面,可能NET版本兼容出错,导致FOX崩溃,不用第3方组件,参考这样的代码,简单接收信息行吗,如何改改为FOX代码:
 Dim ws = New System.Net.WebSockets.ClientWebSocket
    ' optional: ignore certificate errors
    ServicePointManager.ServerCertificateValidationCallback = Function(s, c, h, d) True

    Try
        Await ws.ConnectAsync(New Uri("wss://demos.kaazing.com/echo"), Nothing)
        If (ws.State = WebSockets.WebSocketState.Open) Then
            Debug.Print("Opened.")
            Await ws.SendAsync(New ArraySegment(Of Byte)(System.Text.Encoding.UTF8.GetBytes("{ ""message"":""hello""}")), WebSockets.WebSocketMessageType.Text, True, Nothing)
            Dim bytes(4096) As Byte
            Dim answ = New ArraySegment(Of Byte)(bytes)
            Await ws.ReceiveAsync(answ, Nothing)
            Debug.Print("answer:" + System.Text.Encoding.UTF8.GetString(answ.Array))
        Else
            Debug.Print("Not opened?!")
        End If
    Catch
        Debug.Print("Error.")
    End Try
[此贴子已经被作者于2023/3/9 17:36:55编辑过]

 回到顶部
帅哥,在线噢!
WELOVEFOX
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:463 积分:3343 威望:0 精华:0 注册:2016/12/21 22:58:00
  发帖心情 Post By:2023/3/9 18:12:00 [显示全部帖子]

谢谢杰哥,我试过不知是不是那个16年播放音乐那个DLL冲突还是其它原因导致,
现在去除这个音乐DLL,也参照你的例子用了这个Websocket的DLL,还是会出错是,
不知道是不是我FOX出问题,试过重装一样。
因为对这类方面的知识不高,不是用这个Websocket的DLL自建的服务器,
而是别人给的websocket现成exe可执行端。不知道它的运行方式,只知道它会不断发包出来。

是不是引用这个

[免费开源]狐表bs集成websocket方法,dll来源于github 3.5k高分数的C# Websocket库 稳定性和兼容性非常好 。 相当于web bs领域的OpenQQ功能


里面的Websocket的DLL,也能接收第3方的WS服务器的信息,谢谢。

 回到顶部
帅哥,在线噢!
WELOVEFOX
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:463 积分:3343 威望:0 精华:0 注册:2016/12/21 22:58:00
  发帖心情 Post By:2023/3/10 11:51:00 [显示全部帖子]

谢谢蓝版,再请教下。

迫着自己去学了一下WEB方面,我将html静态页面,改为用FOX制作WEB端,
已经将第一个简单的HTML模板转换到FOX了,但是不会写将获取的内容写入到数据库。

主要httprequest代码:

Select Case e.Path
    Case "get"
        Dim sb As New StringBuilder
        sb.AppendLine("<!DOCTYPE  HTML PUBLIC>")
        sb.AppendLine("<html>")
        sb.AppendLine("<head>")
        sb.AppendLine("<title>websocket client</title>")
        sb.appendline("<script src='./css/g.js'></script>")
        sb.AppendLine("</head>")
        sb.AppendLine("<body>")
        sb.AppendLine("<form id='sendForm'>")
        sb.AppendLine("<span>输入内容按回车发送消息</span> <br/>") 
        sb.AppendLine("<input id='sendText' placeholder='Text to send' />")
        sb.AppendLine("</form>")

        sb.AppendLine("<pre id='incomming'></pre>")  ‘这段应该就是调用ID incomming,不断在前端页面刷新接收到的每一条信息。
        
        sb.AppendLine("</body>")
        sb.AppendLine("</html>")

        e.WriteString(sb.ToString)

End Select

也将javascript部分改为引用外部文件g.js
代码是:
var start = function () {
            var inc = document.getElementById('incomming');
            var wsImpl = window.WebSocket || window.MozWebSocket;
            var form = document.getElementById('sendForm');
            var input = document.getElementById('sendText');
 
            inc.innerHTML += "连接服务器..<br/>";
 
            // 创建一个新的websocket并连接
            window.ws = new wsImpl('ws://127.0.0.1:777/');
 
            // 当数据来自服务器时,将调用此方法
            ws.onmessage = function (evt) {
                //不断刷新接收来自服务器的信息;
                inc.innerHTML = (evt.data);
  
            };
 
            // 当建立连接时,将调用此方法
            ws.onopen = function () {
                inc.innerHTML += '已建立连接.. <br/>';
            };
 
            // 当连接关闭时,将调用此方法
            ws.onclose = function () {
                inc.innerHTML += '连接已关闭.. <br/>';
            }
 
            form.addEventListener('submit', function (e) {
                e.preventDefault();
                var val = input.value;
                ws.send(val);
                input.value = "";
            });
            
        }
        window.onload = start;


经常这样构造,和普通静态的HTML模板运行的效果是一样的,也能正确收到信息了
如何将刷新的每一条incomming字符内容保存到指定的数据库里面呢?
基础差,只能想到应该是将下面红色代码改造一下,WEB端基础差了点,实在不会加进去了,还请示范下,谢谢。

Dim dr As DataRow = DataTables("记录表").SQLAddNew()
dr("内容") = e.Values("incomming")
dr.Save() '用SQLAddNew增加的行,必须保存一下,否则会被丢弃. 


 回到顶部
帅哥,在线噢!
WELOVEFOX
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:463 积分:3343 威望:0 精华:0 注册:2016/12/21 22:58:00
  发帖心情 Post By:2023/3/10 13:42:00 [显示全部帖子]

谢谢。试过,获取不到,而且这样另用页面获取不能达到自动保存。需要不断刷新?
accept.htm代码改为下面,也显示未收到信息,后端保存的也确实一条空白数据,
我的意思是在这个前端get单页面内将不断接收到的信息,直接保存给数据库,不用额外accept.htm接收,这样不断刷新accept.htm来保存不现实图片点击可在新窗口打开查看
接收到的应该是{}的JSON字符串,不处理JSON也没关系,就是希望将这段字符串同时保存到后台数据里。

    Case "accept.htm"
'        Dim dr As DataRow = DataTables("记录表").SQLAddNew()
'        dr("内容") = e.PlainText
'        dr.Save()
'        e.WriteString(e.PlainText) 

        If e.PlainText > "" Then
            e.WriteString("服务器收到以下数据:" & vbcrlf & e.PlainText)
        Else
            e.WriteString("服务器未收到数据")
        End If

见运行图


图片点击可在新窗口打开查看此主题相关图片如下:动画.gif
图片点击可在新窗口打开查看





[此贴子已经被作者于2023/3/10 13:45:59编辑过]

 回到顶部
帅哥,在线噢!
WELOVEFOX
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:463 积分:3343 威望:0 精华:0 注册:2016/12/21 22:58:00
  发帖心情 Post By:2023/3/10 14:09:00 [显示全部帖子]

我只是构建了前端页面来接收第3方的websocket服务器所必发送的数据。不是自己的websocket服务器.。
e.PlainText收到空白数据,可能是JS里面只刷新了内部的ID incomming,这个单页面握手成功后,应该不是整个页面刷新的,应该是JS自己的页面内incomming局部刷新的?

 回到顶部
帅哥,在线噢!
WELOVEFOX
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:463 积分:3343 威望:0 精华:0 注册:2016/12/21 22:58:00
  发帖心情 Post By:2023/3/10 15:25:00 [显示全部帖子]

inc.innerHTML = (evt.data); 这段起作用,页面不断刷新
sendAjaxText(evt.data,"accept.htm","",false); 这段还是不起作用,应该是没有执行sendAjaxText,因为不刷accept.htm,它也不会保存一行空白数据。

换下面这些也不起作用
//sendAjaxText((evt.data),"accept.htm","",false); 
//sendAjaxText(inc,"accept.htm","",false);
//sendAjaxText(inc.innerHTML,"accept.htm","",false);

所以刷新accept.htm一次,accept.htm就保存了一次空白数据,因为没有收到endAjaxText数据。
所以大概率就是sendAjaxText没有执行。

是不是用sendAjaxText函数,需要引用其它一些JS文件? 例如ajaxform.js文件等等,因为我只是简单用
Dim sb As New StringBuilder
e.WriteString(sb.ToString)
来构建WEB端,不是使用weui框架构建的。
会不会是这个原因导致?还是?




 回到顶部
帅哥,在线噢!
WELOVEFOX
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:463 积分:3343 威望:0 精华:0 注册:2016/12/21 22:58:00
  发帖心情 Post By:2023/3/10 16:24:00 [显示全部帖子]

确实是需要使用WEUI构建才行图片点击可在新窗口打开查看,已经成功接收并保存到了。
给蓝版大大个赞,得让狐爸好好奖励下,毕竟Websocket服务器对接FOX端内容太少了,须然CS端没搞成,还好手上是高开的FOX,暂时就用BS端应付着了

再请教个问题:
"sendAjaxText"的函数

sendAjaxText(data,url,func,asyn)

data 要发送的文本数据,
url 接收数据的目标网页。
func 回调函数名,收到服务器返回信息后,会调用此函数进行处理。
asyn 逻辑型,可选参数,是否异步执行,默认为true,如果要同步执行,请设置为false。
注意是true和false,不是True和False。
这个asyn异步方式发送数据方式,是用同步好,还是异步好。影响到哪些方面?如获取数据丢失或项目端其它操作?












 回到顶部
帅哥,在线噢!
WELOVEFOX
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:463 积分:3343 威望:0 精华:0 注册:2016/12/21 22:58:00
  发帖心情 Post By:2023/3/10 17:08:00 [显示全部帖子]

好的,万分感谢蓝版图片点击可在新窗口打开查看

 回到顶部