Envoyer un message entre 2 Macs
apocaalypso
Membre
Bonjour,
Après m'être adonné à la programmation iPhone, je débute la programmation Mac et biensûr cela me pose quelques problèmes.
Je voudrais envoyer un message quelconque entre deux Macs par l'intermédiaire de mon application. C'est à dire que les deux Macs lancent l'application et l'un envoie un message à l'autre. Peut-être par Bluetooth ?
Mais je ne sais absolument pas vers où m'orienter, quelqu'un saurait m'aiguiller ?
Merci d'avance !
Après m'être adonné à la programmation iPhone, je débute la programmation Mac et biensûr cela me pose quelques problèmes.
Je voudrais envoyer un message quelconque entre deux Macs par l'intermédiaire de mon application. C'est à dire que les deux Macs lancent l'application et l'un envoie un message à l'autre. Peut-être par Bluetooth ?
Mais je ne sais absolument pas vers où m'orienter, quelqu'un saurait m'aiguiller ?
Merci d'avance !
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Après tu as d'autres solutions sans doute, qui se basent au final un peu dessus au final. C'est pour un besoin spécifique ? Ou tu veux pouvoir envoyer tout et n'importe quoi ?
En fait tout ce passe par l'application ouverte sur les 2 Macs.
Non, je veux seulement envoyer du texte et au pire une image.
Si j'utilise Bonjour c'est bon ?
Donc c'est un complément, qui peut être sympa et pratique, mais n'est pas indispensable pour faire communiquer 2 machines. Bonjour permet à 2 machines de se découvrir et savoir qu'elles peuvent communiquer ensemble via le même langage (protocole) mais ne fournit pas de moyen de communiquer à proprement parler.
En gros :
- tu as sur ton réseau plusieurs imprimantes compatibles Bonjour (la plupart le sont aujourd'hui il me semble d'ailleurs). Une que tu auras nommée "Imprimante Couleur", l'autre "Imprimante N&B", la 3e "Imprimante Salon", par exemple .
- tu es sur ton mac et tu veux imprimer. Bah ton logiciel va demander à Bonjour "liste moi tous les trucs sur le réseau qui proposent le service "_printer._tcp" (printer est le type correspondant au service d'impression, tu l'auras compris).
- Bonjour va te répondre en listant les 3 imprimantes sus-citées, donc il va te dire : ok j'ai trouvé 3 imprimantes qui s'annoncent sur le réseau : "Imprimante Couleur", "Imprimante N&B" et "Imprimante Salon".
- Du coup toi tu lui dis "bon ok, je veux utiliser "Imprimante Salon". Et Bonjour va te répondre "ok, pour la contacter utilise l'IP 10.0.2.103 sur le port 27 (par exemple).
Mais après c'est tout ce que fait Bonjour.
Une fois que tu as l'IP et le port, faut toujours que tu contactes l'imprimante pour communiquer avec elle (lui envoyer les données à imprimer, etc).
Conclusion :
1) Si tu connais déjà par coeur l'IP de l'imprimante et le port sur laquelle la contacter, pas besoin de Bonjour. Dans ton cas si tu connais l'IP de ton 2e mac et le port sur lequel il est en attente de connections entrante, pas besoin de Bonjour
2) Dans tous les cas, Bonjour ou pas, il te faudra mettre en place un canal de communication pour dialoguer entre les 2 ordniateurs. On utilise pour ça les sockets. Un socket sur chaque mac, un sur un mac qui écoute sur un port réseau donné (par exemple ton premier mac, ayant l'IP 10.0.0.1, sur lequel tu crées un socket que tu mets en écoute = attente de connection sur le port 1300), c'est le "serveur", et sur l'autre mac (ça sera le "client") un autre socket qui va aller se connecter sur 10.0.0.1:1300. Une fois que la connection est réalisée, l'un ou l'autre des sockets peut envoyer des données au socket se trouvant à l'autre bout (donc envoyer des données à l'autre mac), et l'autre peut vérifier la présence de données sur le socket et les lire le cas échéant.
Voilà pour les principes de base. Donc oui tu peux utiliser Bonjour, mais peut-être dans un 2e temps, quand tu maà®triseras les sockets, pour ne pas risquer de tous mélanger.
Ou sinon dans les SampleCodes d'Apple tu as un exemple PictureSharing (qui fait office de "serveur") et PictureSharingBrowser (qui fait office de "client" et va se connecter sur le serveur pour lui demander de lui envoyer l'image), qui montre conjointement l'utilisation de Bonjour ET des Sockets. Mais c'est un peu "dangereux" comme exemple dans le sens où tu as tout d'un coup, pour débuter si t'as jamais manipuler les sockets c'est pas forcément le plus idéal.
Note aussi qu'en Cocoa tu as les NSFileHandle qui savent encapsuler des "fileDescriptors" décrivant des sockets (et non des "fichiers" au sens commun du terme), ce qui fait que tu peux utiliser NSFileHandler pour manipuler tes sockets. Ca a pas mal d'avantages, en particulier te simplifie la vie au niveau des écoutes de connections ou de données entrantes, puisque tu peux demander à ton NSFileHandler de se mettre en écoute en tâche de fond et de t'envoyer une notification quand une connection ou des données arrivent. Du coup t'as plus grand chose à faire du côté du code "bas niveau" (ça tu peux le voir dans ledit SampleCode à la limite mais bon lis plutôt les Programming Guides d'abord et les docs sur les sockets sur le net)
Je vais finalement m'aider du PictureSharing et du PictureSharingBrowser, si je peux envoyer des images je pourrai largement envoyer du texte, merci beaucoup de m'avoir expliquer tout ça
Avoir une réponse aussi précise à une question que l'on a pas encore posée, ce devrait être ça l'avenir de OSX-Dev ;D
Vraiment, c'est expliqué de manière très compréhensive, chapeau monsieur le gourou Cocoa.
ça a l'avantage de simplifier l'aspect réseau et tout ce qui est gestion des socket.
Par contre je ne saurais dire ce qui est le plus simple a appréhender pour quelqu'un qui n'a joué ni avec l'un ni avec l'autre.
Merci pour vos réponses !
Pour mon code concernant l'envoie d'image j'ai :
Pour mon envoie de texte j'ai donc fait :
Et pour la réception du texte :
Texte que j'essaye d'insérer dans un textField. Mais le texte est NULL, pourant j'ai fait à peu près comme pour le code d'envoie d'image.
Quelqu'un pourrait-il m'éclairer ?
Merci d'avance !
ça me renvoie plein de chiffres et lettres entre 2 signes : <> pour mon code d'envoie mais dans le code de réception la data ne renvoie que <>. Donc j'imagine qu'il n'existe pas de l'autre côté mais je ne comprend pas pourquoi.
Si tu veux/peut passe ton projet, comme ça je sèche
Je t'ai envoyé le lien par MP
Vous voulez pas essayer de faire des choses simples ?
Alors évidemment, on utilise des classes toutes faites qui font papa/maman sans trop savoir comment ça fonctionne derrière... pratique. Mais gare au retour de bâton.
- Transformation de NSImage en NSData / transformation de NSString en NSData
- Transformation de NSData en NSImage / transformation de NSData en NSString
[tt]- (void)connectionReceived:(NSNotification *)aNotification {
NSFileHandle * incomingConnection = aNotification userInfo] objectForKey:[b]NSFileHandleNotificationFileHandleItem[/b;
NSData * representationToSend = [[imageView image] TIFFRepresentation];
[[aNotification object] acceptConnectionInBackgroundAndNotify];
[incomingConnection writeData:representationToSend];
[incomingConnection closeFile];
}
[/tt]
[tt]- (void)connectionReceived:(NSNotification *)aNotification {
NSString *message = [textField stringValue];
NSFileHandle * incomingConnection = aNotification userInfo] objectForKey:[b]NSFileHandleNotificationDataItem[/b;
NSData * representationToSend = [message dataUsingEncoding:NSASCIIStringEncoding];
[[aNotification object] acceptConnectionInBackgroundAndNotify];
[incomingConnection writeData:representationToSend];
[incomingConnection closeFile];[/tt]
Pourquoi NSFileHandleNotificationFileHandleItem d'un côté et NSFileHandleNotificationDataItem de l'autre... illogique.
Il y aurait-il une classe qui s'occupe de ça ?
Merci !
Regarde du côté des exemples BT fourni par Apple avec xCode
C'est un peu bancal comme j'en ai déjà fait l'expérience avec un projet client récent, genre l'interface réseau BT dans son profil PAN n'est pas détectée tant qu'elle n'est pas activée (qu'on a pas ouvert de socket dessus)... mais bon ça marchotte.
En tout cas Bonjour (et le GameKit qui permet de faire communiquer 2 iPhones entre eux over BT et se base sur Bonjour pour ça) est supporté sur iPhone et passe over BT.
J'ai failli dire une belle bêtise tout à l'heure :P
Bon, j'ai rarement vu dans les profils courants (AD2P, HFP, HSP, HID, OBEX, ...) des cas d'utilisation d'un pico-réseau mettant en relation plusieurs devices. En fait dans ces cas-là BT est utilisé avec le protocole RFComm, autrement dit l'idée c'est d'avoir un protocole mimant une liaison série (vous savez, les câbles et interfaces RS-232)... mais sans fil.
Par contre dans le profil PAN (Personal Area Network profile), cette utilisation multiclients c'est déjà plus courant, pour la bonne et simple raison que ce profil a pour concept d'utiliser l'interface bluetooth comme une interface réseau, via le protocole BNEP (Bluetooth Network Encapsulation Protocol). Au final votre BT est vu comme une interface réseau au même titre qu'Ethernet ou Wifi, avec une IP et tout. Donc du coup l'aspect multipoint etc. a plus de sens.