Отправка и получение данных XML через TCP - PullRequest
3 голосов
/ 20 февраля 2012

Я пытался выяснить, как отправлять и получать XML-данные через TCP-сервер. Я пришел из 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();
    }

Ответы [ 2 ]

3 голосов
/ 20 февраля 2012

Не читайте, пока не покраснете писателя.

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();
1 голос
/ 21 августа 2012

Попробуйте что-то вроде этого:

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

}
...