通過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