2012-02-20 106 views
3

我一直在想如何通過TCP服務器發送和接收XML數據。我來自java編程背景,所以我在這裏深入一點。我的程序工作,如果我只發送純文本,但是一旦我嘗試發送它只是掛起的XML數據。服務器從不接收消息。 我一直在尋找代碼來做到這一點,並沒有找到任何運氣,我已經看到很多在線代碼示例不起作用。如果您有任何人可以解決這個問題,我會非常感激。通過TCP發送和接收XML數據

請在這裏尋找代碼示例,而不是解釋我應該怎麼做來解決它。我只編寫了C#幾天。 這是示例XML請求。

<?xml version="1.0" encoding="utf-8"?> 
    <ClientRequest> 
     <Product>AGENT</Product> 
     <Method>GET_SYSTEM_INFO</Method> 
     <ClientId>UMOHB</ClientId> 
     <Params> 
     <Param Value="umohb" Key="username" /> 
     <Param Value="password" Key="password" /> 
     <Param Value="localhost" Key="hostname" /> 
     </Params> 
    </ClientRequest> 

這是我的TCP客戶端代碼

public static void sendStringRequest(String hostname, int port, String message) 
    { 
     String response = String.Empty; 
     TcpClient client = getConnection(hostname, port); 

     Console.WriteLine(message); 

     NetworkStream stream = client.GetStream(); 
     StreamWriter writer = new StreamWriter(stream, Encoding.UTF8); 
     writer.AutoFlush = false; 
     writer.Write(Encoding.UTF8.GetBytes(message).Length); 
     writer.Write(message); 
     writer.Flush(); 

     StreamReader reader = new StreamReader(stream, Encoding.UTF8); 
     response = reader.ReadLine(); 

     stream.Close(); 
    } 
+2

@JohnSaunders謝謝你,你的輸入,非常感謝......你有沒有想過,爲什麼你要在你的問題或響應添加代碼示例的選項? – greenkode 2012-02-20 15:38:37

回答

3

不讀,直到你刷新作家。

NetworkStream stream = client.GetStream(); 
StreamWriter writer = new StreamWriter(stream, Encoding.UTF8); 
writer.AutoFlush = false; 
writer.Write(Encoding.UTF8.GetBytes(message).Length); 
writer.Write(message); 
writer.Flush(); 

StreamReader reader = new StreamReader(stream, Encoding.UTF8); 
response = reader.ReadLine(); 

stream.Close(); 
+0

謝謝@jgauffin。但是我仍然遇到同樣的問題。 如果我刪除'reader.ReadLine();'消息成功到服務器。我試過關閉或處理Streams或Writers,但是也關閉了Socket。無論如何向服務器表明寫入操作已完成? – greenkode 2012-02-20 16:18:22

+0

流是網絡流。除非你完成,否則它不應該被關閉。 – jgauffin 2012-02-20 18:33:25

+0

不,不是。我已經更新了上面的客戶端代碼。它與你的完全相同。仍然有同樣的問題。它可能是服務器端的問題嗎?我正在使用一個Java服務器。我懷疑它,因爲如果我註釋掉'reader.ReadLine()'代碼,發送就會很好地完成。謝謝 – greenkode 2012-02-20 20:47:18

0

嘗試是這樣的:

public static string sendStringRequest(String hostname, int port, string message) { 

try { 
    byte[] data = System.Text.Encoding.ASCII.GetBytes(message); 

    TcpClient client = new TcpClient(hostname, port); 

    NetworkStream stream = client.GetStream(); 
    BinaryWriter writer = new BinaryWriter(stream); 

    //first 4 bytes - length! 
    writer.Write(Convert.ToByte("0")); 
    writer.Write(Convert.ToByte("0")); 
    writer.Write(Convert.ToByte("0")); 
    writer.Write(Convert.ToByte(data.Length)); 
    writer.Write(data); 

    data = new Byte[256]; 

    // String to store the response ASCII representation. 
    String responseData = String.Empty; 

    Int32 bytes = stream.Read(data, 0, data.Length); 

    responseData = System.Text.Encoding.ASCII.GetString(data, 4, (bytes - 4)); 

    // Close everything. 
    stream.Close(); 
    client.Close(); 
    return responseData; 
} catch (ArgumentNullException e) { 
    MessageBox.Show("ArgumentNullException: " + e); 
    return "null"; 
} catch (SocketException e) { 
    MessageBox.Show("SocketException: " + e); 
    return "null"; 
} 

}