Решение проблемы Grails с Tcp-клиентом и Tcp-сервером - PullRequest
1 голос
/ 21 января 2011

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

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

Tcp Client:

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

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

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

.

1 Ответ

1 голос
/ 21 января 2011

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

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

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

...