複数のクライアントが 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();
}
}
}
私が解決に苦労している問題は、SerialPort インスタンスとスレッド間の通信を容易にする方法です。
上記のコードが最善の方法であるとは確信していないので、別の解決策を持っている人はいますか (シンプルなほど良い)?