通过TCP共享COM端口到多个客户端的简单设计模式是什么?通过TCP共享COM端口
例如,本地GPS设备可以实时向远程主机传输坐标。
所以我需要一个程序,将打开串口并接受像多个TCP连接:
class Program
{
public static void Main(string[] args)
{
SerialPort sp = new SerialPort("COM4", 19200, Parity.None, 8, StopBits.One);
Socket srv = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
srv.Bind(new IPEndPoint(IPAddress.Any, 8000));
srv.Listen(20);
while (true)
{
Socket soc = srv.Accept();
new Connection(soc);
}
}
}
然后,我会需要一个类来处理连接的客户机之间的通信,使他们都可以看到数据并保持同步,以便客户指令顺序接收:
class Connection
{
static object lck = new object();
static List<Connection> cons = new List<Connection>();
public Socket socket;
public StreamReader reader;
public StreamWriter writer;
public Connection(Socket soc)
{
this.socket = soc;
this.reader = new StreamReader(new NetworkStream(soc, false));
this.writer = new StreamWriter(new NetworkStream(soc, true));
new Thread(ClientLoop).Start();
}
void ClientLoop()
{
lock (lck)
{
connections.Add(this);
}
while (true)
{
lock (lck)
{
string line = reader.ReadLine();
if (String.IsNullOrEmpty(line))
break;
foreach (Connection con in cons)
con.writer.WriteLine(line);
}
}
lock (lck)
{
cons.Remove(this);
socket.Close();
}
}
}
我奋力化解的问题是如何促进一个串口实例和线程之间的通信。
我不确定上面的代码是否是最好的方式,所以有人有另一种解决方案(越简单越好)?
感谢您使用WCF的建议。但是,我忽略了在我的问题中提到我想使用telnet客户端进行连接,并且这将是双向通信,而不仅仅是接收。 我很好奇看到您的实施,但我无法在您的博客上找到任何代码 - 您是否有任何示例?我仍然喜欢在套接字级别工作,但是我在如何与不同线程沟通方面停滞不前。 – 2010-04-08 04:13:00
博客上没有代码,对不起,这是一个庞大的系统。我会在我的答案中增加一些更多的建议。 – 2010-04-08 05:08:13
感谢您的更新和体系结构建议 - 使用队列是一种有效的解决方案。我还发现了以下链接,显示如何将COM端口链接到单个TCP连接:http://www.javiervalcarce.eu/wiki/Access_to_serial_port_from_Internet – 2010-04-09 05:11:25