Grails问题处理Tcp客户端& Tcp服务器

时间:2011-01-21 01:21:33

标签: grails tcp client

我创建了一个Tcp客户端& Groovy中的Tcp Server有一段时间了,它没有任何问题。我当时只连接到一台机器来收集数据。这次我尝试连接到多个主机上的脚本,它只保存我的grails应用程序中的一个主机信息。

我的Grails应用程序很简单,它有一个机器类的域类(基本上是我寻求的计算机和它们的信息),它将使用我的TcpClient.groovy脚本来连接和收集来自TcpServer.groovy的信息。其他电脑。对于每个主机,它应该保存收集的信息,但是,它似乎跳过了保存除最后一个之外的任何主机。

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

我是否需要暂停一下,以便服务器有时间发送回复?我的Tcp客户端会发送所有命令,但只获取最后一组命令的响应。

另外,对于我的代码片段的缩进问题感到抱歉,我不确定它们为什么会混乱。

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题。例如,tcpClient从不分配给hardDrive。假设这是一个疏忽,我认为真正的问题是tcpClient正在查询多个主机的数据,并将所有结果存储在相同的实例变量answers中,最终lastReadmachineName ,和ipAddress

您需要分别存储每个主机的结果。一种方法是让answers成为列表地图。例如,answers[host][0]将是给定主机的第一个答案。

我认为不需要任何暂停。