2010-08-14 17 views
0

J'ai créé un client et un serveur tcp de base dans groovy et je veux envoyer des cartes du serveur au client, je me demande si je peux envoyer des cartes à travers et toujours être capable d'accéder aux valeurs.Groovy Tcp client/serveur envoi de cartes

//TCP Server 
def book1 = [Title of Book: "Groovy Recipes", Author: "Scott Davis", Number of Pages: "241"] 

server = new ServerSocket(2000) 

println("Waiting for connection") 

while(true) { 
    server.accept() { socket -> 
     socket.withStreams { input, output -> 

      w = new BufferedWriter(new OutputStreamWriter(output)) 
      String message = "Connection was successful" 

      r = new BufferedReader(new InputStreamReader(input)) 

      while(true) { 

       if(message != null) { 
        w.writeLine(message) 
        w.flush() 
        message = null 
       } 

       String a = r.readLine() 

       if(a=="book1") { 
        message = book1 
       } else { 
        message = "$a command unknown." 
        sendMessage(message) 
        println message 
        message = null 
       } 
      } 
     } 
    } 
} 

def sendMessage(String msg) { 
    try { 
     w.writeLine(msg) 
     w.flush(); 
    } catch(IOException ioException) { 
     ioException.printStackTrace(); 
    } 
} 

Voici mon client (où je suis désireux de recevoir la carte et obtenir les valeurs)

//TCP Client 

def grabBookInfo { 
    queryData() 
} 

public void queryData() { 
    def hosts = ["localhost"] 

    for(int aHost = 0; aHost < hosts.size; aHost++) { 
     bookClient(hosts[aHost]); 
    } 
} 

public void bookClient() { 
    def commands = ["book1"] 
    def answers = [commands.size] 

    def requestSocket = new Socket(host, 2000) 

    r = new BufferedReader(new InputStreamReader(requestSocket.getInputStream())); 
    w = new BufferedWriter(new OutputStreamWriter(requestSocket.getOutputStream())); 

    String message = "Connection was successful" 

    message = r.readLine() 
    println("Server>" + message) 

    for(int n = 0; n < commands.size; n++) { 
     sendMessage(commands[n]); 
     answers[n] = r.readLine() 
    } 

    //get map values here 
    //answers[0] = Book 
    //println Book.['Title of Book'] 
    //println Book.['Author'] 
    //println Book.['Number of Pages'] 

    w.flush() 
    w.close() 
} 

public void sendMessage(msg) { 
    w.write(msg+"\r\n"); 
    w.flush(); 
    System.out.println("client>" + msg); 
    } 
} 

Suis-je sur la bonne voie?

+0

Qu'est-ce qui se passe lorsque vous exécutez le code? –

+0

Eh bien cela fonctionne bien pour les chaînes mais je me demandais juste comment extraire chaque valeur d'une carte afin que je puisse utiliser chaque livre qui sera envoyé par le serveur – StartingGroovy

Répondre

1

Dans le serveur, utilisez ObjectOutputStream. Dans le client, utilisez ObjectInputStream.

Serveur:

private static final HashMap<String, Integer> TEST_MAP; 
static { 
    TEST_MAP = new HashMap<String, Integer>(); 
    TEST_MAP.put("one", 1); 
    TEST_MAP.put("two", 2); 
} 
... 

ServerSocket ss = new ServerSocket(port); 
Socket socket = ss.accept(); 
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); 
out.writeObject(TEST_MAP); 
out.close(); 

Client:

Socket socket = new Socket(HOST, PORT); 
ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); 
Object o = in.readObject(); 
assert o instanceof HashMap<?, ?>; 
@SuppressWarnings("unchecked") 
HashMap<String, Integer> m = (HashMap<String, Integer>)o; 
assertTrue(m.get("one") == 1); 
assertTrue(m.get("two") == 2); 
in.close(); 
socket.close(); 
+0

Par la façon dont «in» est un mot réservé dans Groovy, donc le ci-dessus donnera des erreurs. – HeretoLearn