2017-01-08 4 views
1

J'essaie d'envoyer des données via la connexion tcpClient pour faire fonctionner un périphérique qui reçoit une entrée et effectue l'opération requise. Sur le serveur, les données sont reçues dans une boucle et les valeurs sont définies dans un tableau. Le code ressemble à ceci:écriture continue de données en utilisant tcpClient

client = server.available(); 
//Receive Data 
while(client.available()){ 
for(int i = 7; i<11; ++i){ 
    String msg = client.readStringUntil('\n'); 
    senddata[i] = msg.toInt(); 
    msg =""; 
    } 

Ma fonction côté client ressemble à ceci:

static void Connect(String server, String message) 
    { 
     try 
     { 
      // Create a TcpClient. 
      // Note, for this client to work you need to have a TcpServer 
      // connected to the same address as specified by the server, port 
      // combination. 
      Int32 port = 85; 
      TcpClient client = new TcpClient(server, port); 

      // Translate the passed message into ASCII and store it as a Byte array. 
      Byte[] data = System.Text.Encoding.ASCII.GetBytes(message); 


      // Get a client stream for reading and writing. 
      // Stream stream = client.GetStream(); 

      NetworkStream stream = client.GetStream(); 

      // Send the message to the connected TcpServer. 

      stream.Write(data, 0, data.Length); 

      Console.WriteLine("Sent: {0}", message); 

      // Receive the TcpServer.response. 

      // Buffer to store the response bytes. 
      data = new Byte[256]; 

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

      // Read the first batch of the TcpServer response bytes. 

      Int32 bytes = stream.Read(data, 0, data.Length); 
      responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); 

      Console.WriteLine("Received: {0}", responseData); 

      // Close everything. 
      stream.Close(); 
      client.Close(); 
     } 
     catch (ArgumentNullException e) 
     { 
      Console.WriteLine("ArgumentNullException: {0}", e); 
     } 
     catch (SocketException e) 
     { 
      Console.WriteLine("SocketException: {0}", e); 
     } 

     Console.WriteLine("\n Press Enter to continue..."); 
     Console.Read(); 
    } 

Je veux être capable d'écrire des données en continu avant de fermer la connexion. Essentiellement quelque chose comme ceci:

int[] data = new int[4]; 
    data[0] = 1; 
    data[0] = 1; 
    data[0] = 1; 
    data[0] = 1; 

    for (int i = 0; i < data.Length; i++) 
    { 
     Connect("192.168.1.125", data[i].ToString()); 
    } 

Actuellement, les données sont envoyées et la connexion est fermée et le serveur ne reçoit pas plus de données à traiter. J'ai essayé différentes solutions mais sans aucune chance.

Modifier

J'ai essayé de courir le code ci-dessous dans une boucle qui écrit des données à flux:

  for (int i = 0; i < 4; i++) 
     { 
      stream.Write(data, 0, data.Length); 

      Console.WriteLine("Sent: {0}", message); 

      // Receive the TcpServer.response. 

      // Buffer to store the response bytes. 
      data = new Byte[256]; 

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

      // Read the first batch of the TcpServer response bytes. 

      Int32 bytes = stream.Read(data, 0, data.Length); 
      responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); 

      Console.WriteLine("Received: {0}", responseData); 
     } 
      // Close everything. 
      stream.Close(); 
      client.Close(); 

Je reçois l'erreur suivante: Additional information: Unable to read data from the transport connection: An established connection was aborted by the software in your host machine.

+0

, vous fermez la connexion du côté client, pourquoi ne pas garder la connexion ouverte jusqu'à ce qu'une demande de fermeture est envoyé du serveur/client ? – Icepickle

+0

Je n'arrive pas à écrire des données si je ne ferme pas la connexion immédiatement après avoir lu la réponse du serveur. Je reçois une sorte d'erreur –

+0

Que diriez-vous d'ajouter cette erreur à la question? – Icepickle

Répondre

0

Votre Connect() en cours La méthode ouvre la connexion, effectue une opération d'écriture/lecture et ferme la connexion. Vous devez déplacer le code de fermeture & de l'ouverture de la connexion et laisser uniquement la logique d'écriture/lecture.

La raison pour laquelle les données ne sont pas écrites si vous ne fermez pas la connexion est l'utilisation de l'algorithme de Nagle. Voir ce answer pour les détails. Pour résoudre ce problème vient de mettre TcpClient.NoDelay à true comme dans le code ci-dessous:

static void WriteData(NetworkStream stream, String message) 
{ 
    try 
    { 
     // Translate the passed message into ASCII and store it as a Byte array. 
     Byte[] data = System.Text.Encoding.ASCII.GetBytes(message); 

     // Send the message to the connected TcpServer. 

     stream.Write(data, 0, data.Length); 

     Console.WriteLine("Sent: {0}", message); 

     // Receive the TcpServer.response. 

     // Buffer to store the response bytes. 
     data = new Byte[256]; 

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

     // Read the first batch of the TcpServer response bytes. 

     Int32 bytes = stream.Read(data, 0, data.Length); 
     responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); 

     Console.WriteLine("Received: {0}", responseData); 
    } 
    catch (ArgumentNullException e) 
    { 
     Console.WriteLine("ArgumentNullException: {0}", e); 
    } 
    catch (SocketException e) 
    { 
     Console.WriteLine("SocketException: {0}", e); 
    } 
} 

static void ClientCode() 
{ 
    int[] data = new int[4]; 
    data[0] = 1; 
    data[0] = 1; 
    data[0] = 1; 
    data[0] = 1; 

    // Create a TcpClient. 
    // Note, for this client to work you need to have a TcpServer 
    // connected to the same address as specified by the server, port 
    // combination. 
    Int32 port = 85; 
    TcpClient client = new TcpClient(server, port); 
    client.NoDelay = true; 

    // Get a client stream for reading and writing. 
    NetworkStream stream = client.GetStream(); 

    for (int i = 0; i < data.Length; i++) 
    { 
     WriteData(stream, data[i].ToString()); 
    } 

    // Close everything. 
    stream.Close(); 
    client.Close(); 
} 
bien
+0

Je reçois l'erreur que j'ai mise à jour dans ma question. –