0

皆さんこんにちは!

プロジェクトの目標: クライアント、コンソール、およびサーバーの実行可能ファイルを使用して通知プログラムを構築します。選択したユーザーのみが通知を受け取る必要があります。

問題: コードがうまく機能し、すべてが機能する場合があります (実行の 20%)。残りの時間は、データが送信される順序を台無しにします。

コード: サーバー (コンソール = TCPclient):

private void Connect()
{
    string username = ReadFromConsole();

    if (IsUserAllowed(username)) // Receive username
        SendToConsole(bool.TrueString); // Send confirmation
    else
    {
        SendToConsole(bool.FalseString); // Send denial
        console.Close();
        return;
    }

    string messageID = ReadFromConsole(); // Receive MessageID

    string recipientCount = ReadFromConsole();
    int numOfRecipients = int.Parse(recipientCount); // Receive and parse number of recipients

    List<string> recipients = new List<string>();
    for (int i = 0; i < numOfRecipients; i++)
    {
        string recipient = ReadFromConsole();
        recipients.Add(recipient); // Receive recipient, add to list (required for Message)
    }

    string department = ReadFromConsole(); // Receive department string

    string visibleTime = ReadFromConsole(); // Receive visibility timespan

    string expiration = ReadFromConsole(); // Receive expiration datetime

    StoreRTF(messageID); // Receive and store RTF file

    console.Close(); // Connection is done, close

    Message message = new Message(messageID, department, recipients, visibleTime, expiration);
}

コンソール (サーバー = TCP クライアント):

private void SendMessage()
{
    SendToServer(Environment.UserName);
    if (bool.Parse(ReadFromServer()))
    {
        // User is allowed, continue
        string messageID = DateTime.Now.ToUniversalTime().Ticks.ToString();

        SendToServer(messageID); // MessageID

        string recipientCount = lvRecipients.Items.Count.ToString();

        SendToServer(lvRecipients.Items.Count.ToString()); // Amount of recipients

        foreach (string item in lvRecipients.Items) // Loop to send each recipient
        {
            SendToServer(item);
        }

        string department = TB_Department.Text;

        SendToServer(department); // Send department string

        string visibleTime = TimeSpan.FromSeconds(SLIDER_VisibleTime.Value).Ticks.ToString();

        SendToServer(visibleTime); // Send message visibility time

        string expiration = DateTime.Now.ToUniversalTime().AddMinutes(2).ToString();

        SendToServer(expiration); //TODO add UI control for this

        SendRTFToServer(); // Send RTF file

        MessageBox.Show(
            "Your designated MessageID is: " + messageID + Environment.NewLine +
            "Message upload is succesful.",
            "Complete",
            MessageBoxButton.OK);
    }
    else
    {
        // User is not allowed. Report to user. Disconnect (will be managed by the finally block)
        MessageBox.Show("You are not allowed to upload messages to the server.", "Access denied", MessageBoxButton.OK, MessageBoxImage.Stop);
        return;
    }

}

パーツの送受信 (コンソール/サーバー/クライアント間で同じ):

private void SendToServer(string toSend)
{
    while (server.GetStream().DataAvailable)
    {
        // Should wait
    }

    StreamWriter writer = new StreamWriter(server.GetStream());
    writer.WriteLine(toSend);
    writer.Flush();
}

private void SendRTFToServer()
{
    while (server.GetStream().DataAvailable)
    {
        // Should wait
    }

    File.Open(RTFLocation, FileMode.Open, FileAccess.Read).CopyTo(server.GetStream());

    server.GetStream().Flush();
    server.GetStream().Close();
}

private string ReadFromServer()
{
    server.GetStream().Flush();
    StreamReader reader = new StreamReader(server.GetStream());
    return reader.ReadLine();
}

また、さまざまなループ、実装、バイト [] への切り替えを試しました...

多くのデバッグの後、私はどこにも行きません。どの情報がコンソールから出ているか、すべてチェックアウトして正しい順序になっていることを確認しました。ただし、サーバー側では、まったく異なる順序で受信しているようです。

誰がこれを引き起こしているのか考えていますか?

4

1 に答える 1