以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]已知Websocket服务器地址,请教如何在FOX端接收并保存接受的数据  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=185679)

--  作者:WELOVEFOX
--  发布时间:2023/3/9 17:22:00
--  [求助]已知Websocket服务器地址,请教如何在FOX端接收并保存接受的数据
向各位大佬及蓝板请教下:已知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编辑过]

--  作者:有点蓝
--  发布时间:2023/3/9 17:29:00
--  
使用第三方的组件:http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=158906&replyID=&skin=1
--  作者:WELOVEFOX
--  发布时间: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编辑过]

--  作者:有点蓝
--  发布时间:2023/3/9 17:36:00
--  
用不了。Foxtable仅支持到.net 4.0.这个是4.5以上才能使用的类型
--  作者:chen37280600
--  发布时间:2023/3/9 17:59:00
--  
我分享的帖子里,有提供那个websocket的dll下载,是针对.net4进行编译的,没理由不能用。
除非是你的服务器端websocket,有些参数特性,是超越4.0,例如什么ssl要求,才会用不到

--  作者:WELOVEFOX
--  发布时间: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服务器的信息,谢谢。

--  作者:chen37280600
--  发布时间:2023/3/9 22:18:00
--  
应该是别人的websocket都能连接的,因为这种协议的公开标准的。而且它是c#的高分开源东西,应该兼容性很强,只是你要认真研究怎么用
--  作者:WELOVEFOX
--  发布时间: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增加的行,必须保存一下,否则会被丢弃. 


--  作者:有点蓝
--  发布时间:2023/3/10 12:06:00
--  
js
……
            // 当数据来自服务器时,将调用此方法
            ws.onmessage = function (evt) {
                //不断刷新接收来自服务器的信息;
                inc.innerHTML = (evt.data);
  sendAjaxText(evt.data,"accept.htm","",false);
            };
……

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)
    Case "accept.htm"
Dim dr As DataRow = DataTables("记录表").SQLAddNew()
dr("内容") = e.PlainText
dr.Save()
e.WriteString("OK")
End Select
[此贴子已经被作者于2023/3/10 12:07:14编辑过]

--  作者:WELOVEFOX
--  发布时间: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编辑过]