从URI创建流对象(TCP、串行)的工厂方法

本文关键字:串行 工厂 方法 TCP 创建 URI 对象 | 更新日期: 2023-09-27 18:19:45

上下文

我正在编写一个C#程序,它可以与一些硬件通信,有些通过直接串行链路,有些通过TCP/IP套接字。

串行和TCP套接字基本上都是字节流,尤其是在不处理硬件流控制等特定参数的情况下。

需要

通用代码:已解决

为了方便起见,我希望相同的代码能够通过简单的配置在串行和TCP流之间切换。

从软件设计的角度来看,这是一个在所有情况下都获得一个公共对象并仅在客户端代码中使用该对象的问题。在C#中,可以从获得Stream对象

  • http URL(参考c#-从绝对路径获取流?-堆栈溢出)
  • 使用SerialPort.BaseStream属性的SerialPort实例
  • 使用TcpClient.GetStream的TcpClient实例,方法(System.Net.Sockets)

到目前为止还不错。

通过配置切换:缺少链接

现在如何在配置中表示不同的情况?URI会很好。

我知道URI是不可移植的,没关系,不同平台上的配置文件可能不同。

这个讨论Boost邮件页面:Re:[Boost]Re:[network]一个RFC更新提到了URL如何表示这样的流:

server.address=tcp4:/www.example.com:5757
server.address=com1:/57600,n,8,1

20 sim 4C构建说:

serial://com1?baud=115200

像IF2上的串行连接问题与先进的BR…-Intermec社区。


编辑:阅读RFC 2396-统一资源标识符(URI):通用语法看起来下面的字符串会更一致:

serial://com1?baud=9600
serial:///dev/ttyS0?baud=9600
tcp://servernameorip:port

(结束编辑)


如果有一个配置文件提到一个带有tcp或串行参数的URI,并让代码实例化正确的具体类,那就太好了。用设计模式的说法,这被称为工厂方法。

它会这样使用:

Stream mystream1=MyFactoryClass.GetStream("com1:/57600,n,8,1");
Stream mystream2=MyFactoryClass.GetStream("tcp4:/www.example.com:5757");

我在网上或文档中找不到这个。提及串行端口的URI似乎很少见,另一个例子是:使用网络打印机-CUPS.org

问题

有人知道这样一个开源工厂类是否已经存在吗?

这不是很长的时间,但如果它已经存在,最好不要重新发明。

从URI创建流对象(TCP、串行)的工厂方法

它不存在,但我相信内置的Uri类支持自定义方案。

考虑像.NET Framework经常做的那样做。配置文件将指定一个类型名称和一些字符串参数。我认为这里不需要URI。