2012-02-20 3 views
3

Я пытался выяснить, как отправлять и получать XML-данные через TCP-сервер. Я исхожу из java-программирования, поэтому я немного из глубины. Моя программа работает, если я отправляю только обычный текст, но как только я попытаюсь отправить XML-данные, они просто зависают. Сервер никогда не получает сообщение. Я искал код для этого и не нашел удачи, я видел много примеров кода в Интернете, которые не работают. пожалуйста, если кто-нибудь из вас сможет решить эту проблему, я был бы очень благодарен.Отправка и получение данных XML по TCP

Пожалуйста, я ищу примеры кода здесь, а не объяснения, что я должен сделать, чтобы исправить это. Я только кодировал 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 Client Code

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

ответ

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

+0

Поток - это сетевой поток. Он не должен быть закрыт, если вы не закончите. – jgauffin

+0

нет, это не так. Я обновил код клиента выше. Это точно идентично вашему. все еще имея ту же проблему. это может быть проблемой на стороне сервера? Я использую сервер Java. Я сомневаюсь, однако, поскольку отправка идет хорошо, если я прокомментирую код 'reader.ReadLine(). благодаря – greenkode

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

} 
Смежные вопросы