【问题标题】:Sending and Receiving XML data over TCP通过 TCP 发送和接收 XML 数据
【发布时间】:2012-03-10 21:38:19
【问题描述】:

我一直试图弄清楚如何通过 TCP 服务器发送和接收 XML 数据。我来自java编程背景,所以我在这里有点超出我的深度。如果我只发送纯文本,我的程序就可以工作,但是一旦我尝试发送 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();
    }

【问题讨论】:

  • @JohnSaunders 谢谢,非常感谢您的意见...您有没有想过为什么可以选择在您的问题或回复中添加代码示例?

标签: c# xml sockets tcp tcpclient


【解决方案1】:

在刷完 writer 之前不要阅读。

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

【讨论】:

  • 谢谢@jgauffin。但是我仍然遇到同样的问题。如果我删除reader.ReadLine();,则消息成功发送到服务器。我已经尝试关闭或处置 Streams 或 Writers,但这也关闭了 Socket。是否向服务器指示写入操作已完成?
  • 流为网络流。除非您完成,否则不应关闭它。
  • 不,不是这样。我已经更新了上面的客户端代码。它和你的完全一样。仍然有同样的问题。会不会是服务器端的问题?我正在使用 java 服务器。不过我对此表示怀疑,因为如果我注释掉reader.ReadLine() 代码,发送就会顺利进行。谢谢
【解决方案2】:

试试这样的:

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";
 }

}

【讨论】:

    猜你喜欢
    • 2014-07-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多