2010-03-15 3 views
2

Je me demandais comment envoyer un int depuis une application Java à une application C en utilisant des sockets. J'ai différents programmes C qui communiquent entre eux et l'application Java récupère les données de l'application C, mais je ne peux pas travailler sur l'envoi. L'application C sert de base de données, l'application Java envoie alors un identifiant utilisateur (un nombre à 4 chiffres) à l'application C, s'il existe, il renvoie les détails de cet enregistrement.Envoyer un int de Java à C en utilisant des sockets

En Java, j'ai essayé d'utiliser un printWriter et DataOutputStream pour envoyer les données, printWriter produit des symboles étranges et DataOutputStream produit "prof_agent.so".

Toute aide serait appréciée car je n'ai pas une bonne compréhension des prises de courant pour le moment.

+1

« DataOutputStream produit "prof_agent.so" ... Je ne pense pas Afficher un code –

Répondre

1

Vous pouvez envoyer la représentation textuelle. Donc le nombre 123 sera envoyé comme 3 octets '1' '2' '3'.

+0

Comment ferais-je cela –

+0

out.write ("" +123456); - mais c'est un gaspillage de réseau, donner un peu d'effort pour le faire à travers les octets –

3

Vous pouvez utiliser DataOutputStream.writeInt. Il écrit un int déjà dans l'ordre des octets du réseau par contrat.

Sur un côté C vous pouvez appeler recv ou read pour remplir la mémoire tampon de 4 octets, et vous pouvez utiliser ntohl (Network-to-Host-Long) pour convertir la valeur que vous venez de lire à votre représentation int plate-forme.

0

Essayez ceci:

Socket s = ...; 
DataOutputStream out = null; 
try { 
    out = new DataOutputStream(s.getOutputStream()); 
    out.writeInt(123456); 
} catch (IOException e) { 
    // TODO Handle exception 
} finally { 
    if (out != null) { 
     try { 
      out.close(); 
     } catch (IOException e) { 
      // TODO Handle exception 
     } 
    } 
} 

Il whould aider si vous pouviez expliquer un peu plus ce que votre problème.

+0

Je continue à obtenir une IOException sur out.writeInt(). Toute idée de ce qu'il pourrait être parce que, selon mon programme C, il y a une connexion –

+0

Pouvez-vous coller la trace de la pile complète? –

1

Il est un peu trop tard mais laissez cette réponse être ici. Utilisation de sockets UDP:

code Java:

public void runJavaSocket() { 
      System.out.println("Java Sockets Program has started."); int i=0;  
    try { 
      DatagramSocket socket = new DatagramSocket(); 
      System.out.println("Sending the udp socket..."); 
      // Send the Message "HI" 
      socket.send(toDatagram("HI",InetAddress.getByName("127.0.0.1"),3800)); 
      while (true) 
      { 
       System.out.println("Sending hi " + i); 
       Thread.currentThread(); 
       Thread.sleep(1000); 
       socket.send(toDatagram("HI " +    String.valueOf(i),InetAddress.getByName("127.0.0.1"),3800)); 
        i++; 
      } 
     } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

public DatagramPacket toDatagram(
      String s, InetAddress destIA, int destPort) { 
    // Deprecated in Java 1.1, but it works: 
    byte[] buf = new byte[s.length() + 1]; 
    s.getBytes(0, s.length(), buf, 0); 
    // The correct Java 1.1 approach, but it's 
    // Broken (it truncates the String): 
    // byte[] buf = s.getBytes(); 
    return new DatagramPacket(buf, buf.length, 
    destIA, destPort); 
    } 

code C#:..

 string returnData; 
     byte[] receiveBytes; 
     //ConsoleKeyInfo cki = new ConsoleKeyInfo(); 

     using (UdpClient udpClient = new UdpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3800))) 
     { 
      IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3800); 
      while (true) 
      { 
       receiveBytes = udpClient.Receive(ref remoteIpEndPoint); 
       returnData = Encoding.ASCII.GetString(receiveBytes); 
       Console.WriteLine(returnData); 
      } 
     } 
Questions connexes