2010-08-17 5 views
2

Je sens mon problème est un peu étrange, mais ici ...En utilisant Winsock « envoyer » fonction en Java (ou similaire)

J'ai un programme C++ (d'une autre organisation) qui interagit avec caméra connectée au matériel via Ethernet à l'aide de sockets. Sur la surface, la fonction initiale qui envoie un message à la prise est la suivante:

char* cmd = "#TRGON\x0d"; 
m_pClient->Socket_Write((BYTE*)cmd, strlen(cmd)); 

Après avoir à fouiller dans le code, j'ai trouvé la fonction au niveau le plus bas qui envoie effectivement les données:

// Try to send what's in the buffer 
int nFlags = 0; 
int nSent = ::send(m_hSocket, (char*)m_pSendBuffer, m_nSendBufLen, nFlags); 
...checking for errors, etc. 

Maintenant, le programme sur lequel je travaille doit envoyer une commande similaire à la caméra, sauf qu'elle est écrite en Java. J'ai joué avec des sockets Java toute la journée et je n'ai pas réussi à faire faire à l'appareil photo autre chose que de se connecter à l'adresse appropriée (la commande pour allumer les lumières LED). J'ai regardé autour de moi en ligne et j'ai vu que cette commande "send" provient de la bibliothèque Winsock que le programme C++ encapsule. Existe-t-il une façon similaire de faire cela en Java? Ou est-ce que je n'utilise pas la bonne combinaison de DataOutputStreams, de sockets, etc. en Java? Y a-t-il un "import winsock" qui me manque (Googling semble dire qu'il n'y a pas une telle chose)?

Merci beaucoup pour votre aide.

EDIT:

Je ne sais pas vraiment si un code vous aidera! À ce stade, je fais juste des choses de base: se connecter et essayer d'écrire. J'ai apparemment essayé toutes les combinaisons, la conversion, etc. Ceci est juste un code de test (de toute évidence pas robuste ou bonne, comme le bloc catch):

InetAddress addr = null; 
Socket sock = null; 
ObjectInputStream in = null; 
ObjectOutputStream out = null; 

String msg = "#TRGON\\x0d"; 

try { 
    addr = InetAddress.getByAddress(new byte[] { (byte) 192, (byte) 168, 
     (byte) 81, (byte) 58 }); 

    sock = new Socket(addr, PORT); 

    out = new ObjectOutputStream(sock.getOutputStream()); 

    out.writeBytes(msg); 

    in = new ObjectInputStream(sock.getInputStream()); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 

Il est suspendu à la dernière ligne là, le dans = new ... comme s'il ne capte aucun type de flux d'entrée provenant de l'appareil photo. Je sais que je peux continuer à jouer avec, mais tout conseil extérieur est apprécié.

+1

veuillez poster votre code java à analyser. –

+1

1. Supprimez le '\\' du littéral de chaîne. 2. Il suffit d'écrire 'new Socket (" 192.168.81.58 ", PORT)' au lieu de construire vous-même l'adresse IP. 3. N'utilisez pas ObjectOutputStream. –

Répondre

1

Il s'avère que la chaîne de commande envoyée nécessitait un format différent. Au lieu de

"#TRGON\x0d" 

je devais utiliser

"#TRGON\r" 

N'a pas besoin de la chose spécificateur hexagonale. Merci pour les réponses!

3

En général, il devrait être aussi facile que:

Socket s = new Socket("hostname", port); 
OutputStream os = s.getOutputStream(); 
os.write("#TRGON\r".getBytes()); 
os.flush(); 

Quels sont exactement vos problèmes? Bien sûr, si la connexion semble basée sur des caractères, vous ne devez pas utiliser un DataOutputStream mais plutôt lui écrire des chaînes ASCII simples.

[edit: a remplacé le \x0d avec \r]

+0

Eh bien, les gens qui m'ont donné le code de caméra C++ n'ont pas encore de documentation, ce qui freine définitivement tout progrès. Fondamentalement, lorsque la commande est envoyée dans le code C++, la caméra s'allume et renvoie un accusé de réception. Ici, il semble que ça envoie mais rien ne se passe. –

2

On dirait que vous C++ accepte octets simples. Donc, vous devriez faire la même chose avec Java:

InetAddress addr = InetAddress.getByName("192.168.81.58"); 
Socket s = new Socket(addr, PORT); 
OutputStream out = s.getOutputStream(); 
out.write("#TRGON\\x0d".getBytes()); 
s.close(); 

C'est aussi brut que je suppose.

Questions connexes