2011-01-21 5 views
1

Я создал клиент Tcp & Сервер Tcp в Groovy некоторое время назад и не имел никаких проблем с ним. В то время я только подключался к одной машине для сбора данных. На этот раз я пытаюсь подключиться к скрипту на нескольких хостах, и он сохраняет только одну из данных хостов в моем приложении grails.Проблема с Grails с сервером Tcp и сервером Tcp

Приложение My Grails прост, у него есть класс домена для машин (в основном компьютеры и информация о них, которые я ищу), и он будет использовать мой скрипт TcpClient.groovy для подключения и сбора информации из TcpServer.groovy on другие компьютеры. Для каждого хоста он должен сохранять собранную информацию, однако, похоже, он пропускает право на сохранение любого хоста в стороне от последнего.

Tcp Клиент:

//TCP CLIENT  

public void queryData(def hosts) { 

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


public void cristalClient(String host) { 

commands = ["dateScan", "computerName", "ip", "quit"] 

answers = [commands.size] 

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 = readAvailable(r) 
println("Sever>" + message) 

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

lastRead = answers[0] 
machineName = answers[1] 
ipAddress = answers[3] 

w.flush() 
w.close() 
} 


public String readAvailable(r) { 

    String out = "" 
    String dum = null 

    while((dum = r.readLine()) !=null) { 
     if(dum == ">>EOF<<") return out 
     if(out.length() > 0) out += "\r\n" 
      out += dum 
    } 
    return out 
} 


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



public void printData(abc) { 

    abc.eachWithIndex { it, index -> 
    println "Drive $index" 
    it.each { k, v -> 
     println "\t$k = $v" 
    } 
    } 

} 

Tcp Сервер:

//TCP Server 

def server = new ServerSocket(2000) 

println("Waiting for connection") 

    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) { 
        sendMessage(message) 
        message = null 
       } 

       String a = r.readLine() 

       if(a == "dateScan") { 
      message = new Date 
     } else if(a == "computerName") { 
      message = InetAddress.getLocalHost().hostName 
     } else if(a == "ip") { 
      message = InetAddress.getLocalHost().getHostAddress()   
       } else if(a == "quit") { 
        server.close() 
        return 
       } else {      
        message = "$a command unknown." 
        println message 
       } 
      } 
     } 
    } 


def sendMessage(String msg) { 
    println("sending: >" + msg + "<") 
    w.writeLine(msg) 
    w.writeLine(">>EOF<<") 
    w.flush(); 
} 

Grails Контроллер:

//Grails Controller 

CollectMachines { 

    def w = new tcpClient() 
    def hosts = ["winXp", "Win7"] 

    w.queryData(hosts) 
    def abc = w.hardDrive 
    abc.each { println it } 

    int numberOfDrives = abc.size() 

    //add new machine 
    numberOfDrives.times { 

     def machineName = abc.computerName[it] 
     def machineInstance = Machine.findByMachineName(machineName) 

     if (!machineInstance) { 
      machineInstance = new Machine(machineName) 
     } 

     def lastScan = abc.lastScan[it]         
     def scanDate = new Date().parse("E MMM dd H:m:s z yyyy", lastScan) 

     def ipAddress = abc.ipAddress[it]        

     machineInstance.setIpAddress(ipAddress)      
     machineInstance.setDateScanned(scanDate)      
     machineInstance.save()          

    } 
    redirect(action: "list") 
} 

Do I нужно поставить паузу, чтобы сервер успел отправить ответ? Мой клиент Tcp отправляет все команды, но получает ответы только на последний набор команд.

Кроме того, извините за проблемы с отступом с моими фрагментами кода, я не уверен, почему они перепутаны.

.

ответ

1

Есть несколько проблем с вашим кодом. Например, tcpClient никогда не назначает hardDrive. Предполагая, что это надзор, я считаю, что реальная проблема заключается в том, что tcpClient запрашивает данные для нескольких хостов и сохраняет все результаты в тех же переменных экземпляра answers и в конечном итоге lastRead, machineName и ipAddress.

Вам нужно сохранить результаты для каждого хоста отдельно. Одним из способов было бы составить answers карту карт. Например, answers[host][0] будет первым ответом для данного хоста.

Не думаю, что какая-либо пауза необходима.

+0

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

+0

К сожалению, я не могу проверить это до следующей недели. Я не уверен, что вы можете проверить это, но я отправлю альтернативный код, который я придумал, и, возможно, вы можете упомянуть, считаете ли вы, что он должен работать. (Я только собираюсь опубликовать TcpClient и Controller. Я также добавлю список harddrive, поскольку я его использовал) – StartingGroovy

+0

Я не уверен, почему я никогда не возвращался и не прокладывал свой прогресс. Однако я нашел способ заставить его работать, но он довольно медленный и повторяет ненужные функции, на мой взгляд. У меня были проблемы с тем, как вы упомянули ранее, потому что некоторые машины имели несколько IP-адресов или другую информацию, поэтому они были бы перезаписаны и потеряны, если бы у меня была карта списков на основе хоста. Любые другие предложения, когда я чувствую, что помещаю всю информацию в список или карту, а затем добавление информации в базу данных будет быстрее, чем добавление информации в базу данных несколько раз на основе цикла хостов. – StartingGroovy

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