2012-02-20 104 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"; 
} 

}