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

问题描述:

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

我的Grails应用程序很简单,它有一个Machine类的域类(基本上是计算机及其所寻求的信息),它将使用我的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客户端发出所有的命令,但只获得最后一组命令的响应。

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

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

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

我不认为任何一种停顿是必要的。

+0

我的歉意,我不小心拿出将数据推入硬盘的代码。我试图减少代码,并拿出不必要的来源。我认为你对每个主持人的地图都是正确的,我会实施它并回传。 – StartingGroovy 2011-01-21 20:21:10