有几个NSTask
相关问题,但在翻阅之后我仍然不知道该怎么做。
我正在为Cocoa中的java服务器编写一个前端,由java -Xmx1024M -Xms1024M -jar server.jar nogui
启动(我在当前代码中遗漏了nogui
arg,以免填满我的计算机孤立的服务器实例)。
我当前的代码正确运行.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];
我已经阅读了NSPipe
和NSTask
以及所有内容,但我似乎无法回答我的问题:
NSTextView
或NSTableView
。NSTextField
编辑:或者我应该使用launchd
?我该怎么做?
答案 0 :(得分: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:
消息发送到standardInput
实例的ServerController
属性来写入服务器。要从服务器进行阅读,您需要在readInBackgroundAndNotify
媒体资源上使用readabilityHandler
或standardOutput
。