2011-11-28 33 views
0

已經有幾個NSTask相關的問題,但在對它們進行分頁之後,我仍然不知道該怎麼做。我正在爲java -Xmx1024M -Xms1024M -jar server.jar nogui(我在當前代碼中忽略了nogui參數,以免將不必要的孤立服務器實例填滿計算機)寫入可可中的java服務器的前端。將NSTextField的值發送到不斷運行的NSTask

我的當前代碼正確運行.jar文件;現在我需要一種方法來捕獲(並解析)輸出並將輸入發送到進程。

server = [[NSTask alloc] init]; 
pipe = [NSPipe pipe]; 
NSArray *args = [NSArray arrayWithObjects:@"-Xms1024M", 
        @"-Xmx1024M", 
        @"-jar", 
        @"server.jar", 
        nil]; 

[server setLaunchPath:@"/usr/bin/java"]; 
[server setCurrentDirectoryPath:@"MyApp.app/Contents/Resources/"]; 
[server setArguments:args]; 
[server setStandardOutput:pipe]; 
[server setStandardInput:pipe]; 
[server launch]; 

我已經閱讀了關於NSPipeNSTask和一切,但我似乎無法對我的問題,面向一個答案:

  • 現場,解析(?正則表達式)輸出到NSTextViewNSTableView 。從NSTextField

編輯

  • 輸入:或者我應該使用launchd?我會怎麼做?

  • 回答

    3

    您需要製作兩個管道:一個用於任務的標準輸入,另一個用於任務的標準輸出。你現在正在做的是將任務的輸出連接到自己的輸入。

    事情是這樣的:

    @interface ServerController : NSObject 
    @property (strong) NSFileHandle *standardInput; 
    @property (strong) NSFileHandle *standardOutput; 
    @end 
    
    @implementation ServerController 
    
    ... 
    
    - (void)launchServer { 
        NSPipe *standardInputPipe = [NSPipe pipe]; 
        self.standardInput = standardInputPipe.fileHandleForWriting; 
        NSPipe *standardOutputPipe = [NSPipe pipe]; 
        self.standardOutput = standardOutputPipe.fileHandleForReading; 
        ... 
        server.standardInput = standardInputPipe; 
        server.standardOutput = standardOutputPipe; 
        [server launch]; 
    } 
    
    ... 
    

    現在,您可以通過發送writeData:消息給ServerController實例的standardInput財產寫入服務器。要從服務器讀取數據,您需要在standardOutput屬性上使用readInBackgroundAndNotifyreadabilityHandler

    +0

    優秀的答案!非常感謝。現在我只需要輸出到數組中... – citelao

    相關問題