2010-08-14 132 views
0

我在groovy中創建了一個基本的tcp客戶端和服務器,我想從服務器發送地圖到客戶端,我想知道如果我能夠發送地圖並仍然存在能夠訪問這些值。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

當您運行的代碼,會發生什麼? – 2010-08-16 07:40:46

+0

以及它工作正常的字符串,但即時通訊只是想知道如何拉出地圖的每個值,所以我可以使用每本書,將從服務器發送 – StartingGroovy 2010-08-17 21:20:50

回答

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

順便說一句'在'是一個保留字在Groovy所以上面會出錯。 – HeretoLearn 2010-12-06 16:53:26