2

SOでの(一種の-C#とは直接関係ありません)関連の質問は次のとおりです。OpenTSDB(時系列データベース)にデータを挿入する方法; そこで述べたように、(Linuxで)簡単に機能する基本的なシェルコマンドは次のとおりです。

echo "put mymetric.data_1 1295643636 48 a=foo" | nc -w 15 tsdHost tsdPort

私の質問は、C# で OpenTSDB 用のコレクターを作成した人はいますか? 私が直面している問題は、tsd インスタンス/ポートへのソケットを開くことができ、そのストリームに次のように書き込んでも、何も起こらないように見えることです。

put mymetric.data_1 1295643636 48 a=foo

私はインターネットワーク、ストリームベースの TCP ソケットを作成しており、上記の文字列を ASCII、UTF-8、-16、および -32 でエンコードされたバイトとして送信しようとしましたが、すべて無駄でした。

どの種類のソケットのポインタと、どの種類のエンコードされたバイトを使用する必要があるかは、本当に役に立ちます。私が達成しようとしているのと同じことのJavaコードサンプルは次のとおりです。

Socket sock = new Socket("tsd.server.com", 4242); 
String point = "put my.metric 1314137008 60 host=someplace.net foo=1\n"; 
sock.getOutputStream().write(point.getBytes()); 
sock.close();
4

1 に答える 1

0

送信した文字列の末尾に改行文字がないことに気付きました。Java コード サンプルでは、​​改行が明示的にあります。

最後に改行を追加すると、問題が解決しました。

改行を明示的に追加するサンプル コード:

string message = "put mymetric.data_1 1295643636 48 a=foo";
IPAddress ip = IPAddress.Parse("xxx.xxx.xxx.xxx"); // tsdb deamon host ip
IPEndPoint endPoint = new IPEndPoint(ip, 4242); // tsdb deamon port

using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
    s.Connect(endPoint);
    s.Send(new ASCIIEncoding().GetBytes(message + Environment.NewLine));
    s.Close();  
}
于 2012-06-29T13:02:33.320 に答える