2013-10-25 44 views
0

大家下午好!通過tcp socket傳輸多個命令/決定

該項目的目標: 用客戶端,控制檯和服務器可執行文件構建通知程序。只有選定的用戶才能收到通知。

問題: 有時代碼工作的很好,一切正常(運行的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); 
} 

控制檯(服務器= TcpClient的):

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(); 
} 

我也試過不同的循環,實現,切換到字節[] ...

經過大量的調試後,我越來越無處。我檢查了哪些信息正在離開控制檯,並且所有檢查結果都是正確的。但是,在服務器端,它似乎以完全不同的順序接收它。

任何人有一個想法是什麼造成這種情況?

+0

每次發送是否發生在同一個連接上? – Didaxis

+0

每個連接都有自己的線程,每個連接都在發送完畢後終止。如果客戶端重新連接,它會得到一個新的線程。 –

回答