1

Alchemy Webソケットを使用してWebソケットサーバーを実装しましたが、現在、ストレステストを試みています。サーバーに接続してデータを送信する多数のクライアントを作成するために、C#で次のメソッドを作成しました。

private void TestWebSocket()
{
    int clients = 10;
    long messages = 10000;
    long messagesSent = 0;
    String host = "127.0.0.1";
    String port = "11005";

    WSclient[] clientArr = new WSclient[clients];
    for (int i = 0; i < clientArr.Length; i++)
    {
        clientArr[i] = new WSclient(host, port);
    }

    Random random = new Random();
    var sw = Stopwatch.StartNew();

    for (int i = 0; i < messages; i++)
    {
        clientArr[i % clients].Send("Message " + i);
        messagesSent++;
    }
    sw.Stop();

    Console.WriteLine("Clients " + clients);
    Console.WriteLine("Messages to Send" + messages);
    Console.WriteLine("Messages Sent " + messagesSent);
    Console.WriteLine("Time " + sw.Elapsed.TotalSeconds);
    Console.WriteLine("Messages/s: " + messages / sw.Elapsed.TotalSeconds);
    Console.ReadLine();

    for (int i = 0; i < clientArr.Length; i++)
    {
        clientArr[i].Disconnect();
    }

    Console.ReadLine();
}

ただし、サーバーが受信するメッセージは少なくなります(100などの少数の場合でも)。または、複数のメッセージが1つのメッセージとして受信される場合もあります。例:

Message1 = abc Message2 = def

受信者=abcdef

私はここに示されている例を多かれ少なかれ複製しようとしています。現在、サーバーとクライアントの両方がローカルで実行されています。問題が何であるか、またはテスト方法を改善する方法についてのアイデアはありますか?

4

2 に答える 2

1

githubプロジェクトには、似たような2つの未解決の問題があります。

コメント投稿者の1人がFleckの幸運を報告しました

于 2013-03-06T13:11:26.650 に答える
-1

TCPはストリーミングプロトコルであり、メッセージ指向のプロトコルではありません。つまり、受信者は、ストリームに含まれる各メッセージの開始/終了を見つける責任があります。また、受信者は、大きな読み取りを個々のメッセージに分割するだけでなく、完全なメッセージが受信されるまで小さな読み取りを収集する必要があることも意味します。提供されたメッセージの例は、2つが送信され、2つが送信されたことを示しています受信しましたが、サーバーは一方のメッセージがどこで終了し、もう一方のメッセージがどこで開始するかを判断できないようです。各メッセージの開始と終了をマークするために、データに何らかの内部プロトコルを追加する必要があるかもしれません。メッセージが常に正確に同じ長さである場合は、サイズで作業することもできますが、信頼性が低く、他の通信方法に確実に移植するのが難しい可能性があります(プログラムの後半で必要になる場合は、ほとんどの場合に発生します)。私に!)

メッセージがすべて同じ長さである場合、受信者は通常、読み取りサイズをその長さに制限できるため(ライブラリはわかりませんが)、大きな読み取りを分離する必要はありません。ただし、 TCP / IPスタックが物理ネットワークで送信するためにストリームからパケットにデータを収集する方法が原因で、小さな読み取りが発生する可能性があります。コレクションコードを記述したくない場合は、実際に読み取りを実行する前に、読み取ることができるデータの量を示すピーク関数を見つける必要があります。これにより、プログラムは、少なくとも1つが十分になるまで待機できます。メッセージ全体を読む準備ができました。

于 2013-03-06T13:02:01.467 に答える