2011-01-21 9 views
1

私はTurbクライアントをGroovyで一度作成しても何の問題も起きませんでしたが、&というTcpサーバを作成しました。私はデータを収集するために、その時点で1台のマシンに接続していました。今回は、複数のホスト上のスクリプトに接続しようとしていますが、grailsアプリケーションにホスト情報の1つしか保存していません。GrailsがTcpクライアントとTcpサーバを扱う問題

My 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クライアントはすべてのコマンドを送信しますが、最後のコマンドセットに対する応答しか得ません。

また、私のコードスニペットのインデント問題で申し訳ありませんが、私はなぜそれらが台無しになっているか分かりません。

答えて

1

コードにはいくつか問題があります。たとえば、tcpClientは決してhardDriveに割り当てません。これが監視であると仮定すると、実際の問題は、tcpClientが複数のホストのデータをクエリし、すべての結果を同じインスタンス変数answersに格納し、最終的にlastRead,machineName、およびipAddressという結果に格納しているということです。

各ホストの結果を個別に保存する必要があります。 1つの方法は、answersをリストのマップにすることです。たとえば、answers[host][0]は、特定のホストの最初の回答になります。

私は休憩が必要ではないと思います。

+0

私は偶然、データをhardDriveにプッシュするコードを取り出しました。私はコードをスリム化し、不必要なソースを取り出そうとしていました。私はあなたが各ホストの地図について正しいと思います。私はそれを実装してポストバックします。 – StartingGroovy

+0

残念ながら、私は来週までこれをテストすることができません。私はあなたがこれをテストすることができるかどうかは分かりませんが、私が思いついた代替コードを投稿し、おそらくあなたはそれがうまくいくと思うかどうかについて言及することができます。 (私はTcpClientとControllerを投稿するつもりです。私はそれを使用して以来、hardDriveリストを追加します) – StartingGroovy

+0

私は決して戻って来ず、自分の進捗状況を投稿したことがわかりません。しかし、私はそれを動作させる方法を見つけましたが、それはむしろ遅く、私の意見では不要な機能を繰り返します。いくつかのマシンに複数のIPアドレスやその他の情報があるため、ホストに基づいたリストのマップがあれば上書きされてしまいます。リストやマップにすべての情報を入れてからデータベースに情報を追加すると、ホストのループに基づいて情報をデータベースに複数回追加するよりも早くなります。 – StartingGroovy

関連する問題