应用设计咨询

时间:2009-09-24 18:19:10

标签: .net vb.net winforms tcp

我正在为我目前正在开发的应用程序寻找一些建议。我会尽量保持这个简短,所以如果需要其他信息,请告诉我。

我正在使用VB.Net(VS 2008 Pro)开发基于Winforms的事件跟踪系统。应用程序通过串行条形码扫描程序收集数据,并将此数据存储在安装了应用程序的同一Windows XP Pro工作站上的MS SQL Express数据库中。当应用程序收到格式化的数据字符串时,它会检查db表并将回复发送回设备,指示数据是否重复。我编写了一个PortManager类来处理基于串行的设备,这个功能运行良好。

我现在被要求在系统中加入一种新型的收集装置。新设备运行嵌入式Linux并使用TCP \ IP(POE)而不是串行通信。设备制造商向我保证,他可以使用与基于串口的设备相同格式的设备集成扫描仪提供字符串。

如果可能的话,我想利用当前的应用程序,只需添加使用TCP \ IP设备的功能。我当时认为可以添加一个新类(类似于我的Port Manager类)来处理基于TCP \ IP的设备。

我真的不知道如何处理这个问题。我对使用基于TCP \ IP的设备从Winforms应用程序收集数据并不熟悉。

有关通过TCP \ IP与Winforms应用程序进行通信的最佳方法和/或示例代码的任何建议将不胜感激。

感谢您提供任何帮助!

3 个答案:

答案 0 :(得分:2)

我能想到的最干净的方法是重构代码以接受流的输入。然后,您可以更改您的端口管理器以写入您的应用程序提供的流。 .net中的TCP / IP通信最容易使用网络流处理,所以现在你有了一个干净的界面,以后可以进一步扩展以包含平面文件流,来自其他应用程序/插件的内存流。< / p>

答案 1 :(得分:1)

为输入创建一个简单的包装器对象。听起来,无论事件如何进入您的系统,您都会生成消息或事件。

简单的界面就像

public interface IBarcodeScanner 
{
  IEnumerable<BarcodeEvent> ReadEvents();
}

然后,您可以在应用程序的单独线程中使用它,如下所示。

var barcodeScanner = OpenConnectedScanner();
foreach (var barcodeEvent in barcodeScanner)
{
  ProcessEvent(barcodeEvent);
}

然后您需要创建两种类型的IBarcodeScanner。串行端口版本和TCP / IP版本。作为额外的好处,您可以创建一个虚拟条形码扫描仪,以便于测试您的代码。

答案 2 :(得分:0)

如果您认为重构端口类太难,还有另一种选择。您可以创建一个单独的应用程序来执行串行端口操作,并在其中实现与基于TCP / IP的设备非常相似的TCP / IP服务器。

您的应用程序然后更改为使用TCP / IP与扫描仪通信。扫描仪是您的应用程序通过串行端口进行通信,还是使用TCP / IP直接通信的外部扫描程序无关紧要。

同样,这使您能够通过实现简单的存根应用程序来创建虚拟扫描程序。

这不是一种理想的方法,因为您必须创建两个应用程序,并确保在需要时启动TCP / IP到串行应用程序,但它可以正常工作。