复杂的套接字应用程序与多个客户端和web界面

本文关键字:客户端 web 界面 套接字 应用程序 复杂 | 更新日期: 2023-09-27 18:03:20

我创建了一个asp.net网站。在这个网站上,用户可以创建网页和放置按钮。这些按钮通过web套接字向我实现的托盘应用程序发送命令。然后,托盘应用程序接受这些命令,并使用TCP连接将它们传递给各种第三方应用程序。然后第三方应用程序执行命令并将其状态发送回托盘应用程序。托盘应用程序将状态写入sql数据库。网站从数据库中读取状态并处理状态(例如,它突出显示发送原始命令的按钮)

现在真是一团糟。例如,第三方应用程序都以不同的方式处理通信。我该如何组织这样一个申请呢?

我使用ab sql数据库之间,因为我不能确定用户不会重新加载网站。然后web套接字会发生什么?此外,它还可以按照自己的节奏更新按钮。这是一个好的解决方案吗?

而且,我对TCP和套接字编程的知识非常缺乏。大多数资源、教程和指南只是给出非常简单的例子。难道就没有更好的吗?(书籍、文章)

我正在使用一个tcpllistener,它在无限循环中接受网站请求:

static void TcpListenerWorker_DoWork(object sender, DoWorkEventArgs e)
{
    server = new TcpListener(IPAddress.Parse(Properties.Settings.Default.TrayAppServer), Properties.Settings.Default.TrayAppPort);
    // Start listening for client requests.
    server.Start();
    // Buffer for reading data
    Byte[] bytes = new Byte[256];
    String data = null;
    // Enter the listening loop.
    while (true)
    {
        if (TcpListenerWorker.CancellationPending)
            break;
        // Perform a blocking call to accept requests.
        // You could also user server.AcceptSocket() here.
        TcpClient client = server.AcceptTcpClient();
        ...

是否有更好的方法将托盘应用程序链接到网站?

托盘应用程序还必须检查第三方应用程序是否正在运行。只有当它正在运行时,才应该创建套接字。如果第三方应用程序崩溃,连接将消失。如何正确地重新建立连接?

用户现在应该知道他是否可以发送命令。检查应用程序是否像这样运行

Process.GetProcessesByName("exApp1");

是否有更好的方法来检查应用程序?也许通过尝试建立一个tcp连接,如果它失败,应用程序没有运行。但是依赖于失败的连接尝试可能不是一个好决定。

出现了很多错误。连接消失,命令无法到达。我是否可以使用api来更好地处理这些事情(更好的错误和异常处理)?

抱歉,如果这一切听起来令人困惑。整个项目一团糟。

复杂的套接字应用程序与多个客户端和web界面

我要做的一件事就是坐下来,先解开你脑子里的意大利面。如果你对它们进行了适当的抽象,它们使用不同的通信方式这一事实应该无关紧要。

第一个问题是"你需要TCP套接字级通信吗?"我看不出有什么"是"的。假设您这样做了,那么您的第一个问题是获取套接字通信。先把它启动并运行起来。如果这是多个客户机,那么您可以从开源项目开始处理通信位。举个例子,CodePlex上有一个叫做Socket Server的项目,它可以管理Socket。就我个人而言,我并不喜欢项目的设置方式,但请遵循文档并设置服务器。或者搜索另一篇可以为你做这些的文章。

你的下一个问题是"我应该设置一个套接字吗?"如果我是对的,这听起来像是客户方面的问题;如果是这样,请将其与套接字连接分开解决并完成它。我没有足够的带宽来确定你的方法是否是最好的,但是封装代码,你可以替换出确定应用程序是否在运行的方法。

现在让我们跳到多个应用程序以不同的方式通信。如果您有一个输入到多个输出,请考虑简化的服务总线,然后为需要侦听的应用程序编写适配器。如果是多进一出,那么无论如何都需要为应用程序编写适配器。也许有些应用确实需要套接字级通信,你需要一个套接字到web API适配器(只是一个例子,因为我没有足够的细节)。

建议的核心是把问题分解,看看你能把什么分离出来,把重点放在什么地方。许多简单的问题通常比一个复杂的大问题更容易解决。