2010-08-14 4 views
0

Я создал базовый клиент и сервер tcp в groovy, и я хочу отправить карты с сервера клиенту, мне интересно, могу ли я отправлять карты и все еще быть доступ к значениям.Groovy Tcp клиент/сервер, отправляющий карты

//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(); 
    } 
} 

Вот мой клиент (где я хотел получить карту и получить значение)

//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); 
    } 
} 

Я на правильном пути?

+0

Что происходит, когда вы запустите код? –

+0

хорошо работает для строк, но им просто интересно, как вытащить каждое значение карты, чтобы я мог использовать каждую книгу, которая будет отправляться с сервера. – StartingGroovy

ответ

1

На сервере, используйте ObjectOutputStream. В клиенте используется ObjectInputStream.

Сервер:

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(); 

Клиент:

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

Кстати, 'in' является зарезервированным словом в Groovy, поэтому выше дадут ошибки. – HeretoLearn

Смежные вопросы