2012-01-23 5 views
4

objective-c로 분산 객체를 사용하는 서버/클라이언트 응용 프로그램이 있습니다. 지금 당장 힘 쓰고있는 것은 앱을 멀티 스레드로 만드는 것입니다. 따라서 더 많은 사용자가 동시에 서버에 액세스 할 수 있습니다.Distributed Objects, Threading, Objective-C

다음은 서버의 주요 기능입니다. 이것은 nsconnection 객체를 생성하는 곳입니다.

필자가 이해해야 할 것은 사용자가 서버에 액세스하려고 할 때 특정 호출에 대해 새 스레드를 할당해야한다는 것입니다. [conn runInNewThread]가 처리해야합니까?

감사 어떤 생각 ... 여기

는 서버의 코드입니다. 클라이언트의 메시지에 응답하기 위해

int main (void) 
{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

Transactions *trans = [Transactions new]; 
NSConnection *conn = [NSConnection defaultConnection];   
[conn setRootObject: trans]; 
[conn runInNewThread]; 

if (![conn registerName:@"holycow"]) 
{ 
    NSLog (@"Failed registering holycow."); 
    exit (1); 
} 

NSLog (@"waiting for connections..."); 
[[NSRunLoop currentRunLoop] run]; 

[pool release]; 
return 0; 
} 

답변

0

는 응답 서버 개체 는 NSConnection 클래스의 인스턴스의 '루트 개체'로 설정해야하며,이 NSConnection은 네트워크에 의해 등록해야합니다 이름

Distributed object의 경우 단일 서버 개체가 여러 클라이언트를 처리 할 수 ​​있습니다. 또는 더 많은 서버 객체를 생성하고 클라이언트를 나눌 수 있습니다.

+0

이것은 나를위한 것 같습니다. 나는 두 개의 클라이언트 응용 프로그램을 동시에 DO를 통해 동기식 (즉, oneway 키워드를 사용하지 않았다) 클래스 메서드를 호출하도록 할 수있었습니다. 그것은 그것을 위해 자동으로 쓰레드처럼 보였습니다. 서버가 바쁜 일을 하느라 바빴 기 때문에 다소 느린 편 이었지만, 잠깐만 기다리면 서버는 다른 작업을 동시에 처리하는 동안 응답했습니다. 그러나 코더는 oneway (async) 메서드를 사용하여 작업을 시작한 다음 빠른 속도로 실행되는 동기화 메서드를 사용하여 코드를 검사하는 것이 좋습니다. – Volomike

0

@Parag Bafna는 테스트를 통과했을 때 그의 대답에 옳았습니다. 그러나, 나는 이것을 지원했을지도 모르는 서버에서 특별한 종류의 아키텍쳐를 사용했다. 예를 들어 서버 데몬에서 실행하는 데 오랜 시간이 걸리는 명령을 생각해보십시오. 이로 인해 서버가 조금 늘어나고 연결을 처리하는 속도가 훨씬 느려질 수 있습니다. 여기 내 해결책이있다.

  1. 클라이언트가 oneway 속성을 사용하여 비동기식 클래스 메서드를 호출하도록합니다. 이것을 runProcess이라고 부르 자.

  2. runProcess을 작업에서 popen()으로 만들고 PID를 전역 변수로 유지하십시오.

  3. 그런 다음 performSelectorInBackground을 사용하여 readProcess이라는 동기 클래스 메서드를 백그라운드에서 실행합니다. readProcess에서

  4. , 나는 이전에 설정된 popen() 출력 읽기 (전역 변수, ghPID주의) 최근 라인 읽기의 전역 변수로 읽어 최신 라인을 추가 할 while(fgets(buff, sizeof(buff), ghPID)!=NULL)를 사용합니다. 이 방법은 백그라운드 작업으로 실행되며 클라이언트는 이미 runProcess에서 연결이 끊어졌습니다.

  5. 이제 클라이언트가 getProcessData이라는 동기 클래스 메서드에 연결하게하십시오. 그러면 최근에 읽은 행의 전역 변수를 가져와 다시 읽어야합니다. 그 시간이 오래 걸리지 않기 때문에 클라이언트는 그 클래스 메소드를 꽤 빨리 끊습니다.

  6. 클라이언트는 완료 될 때까지 해당 데이터를 폴링 할 수 있습니다. 이를 돕기 위해 isProcessRunning이라는 동기 메소드를 작성하여 서버 디먼의 글로벌 부울 변수 인 gbRunning을 점검하고 true/false를 리턴 할 수 있습니다.물론 서버가 popen() 작업을 실행 중일 때 다양한 클래스 메서드에서 서버 데몬 true/false에서 해당 변수를 바꿔야합니다.

이렇게하면 서버 데몬이 동시 요청에 훨씬 빠르게 응답 할 수 있습니다.

추가 팁은 kill 파일이나 다른 메커니즘 (공유 메모리? SIGHUP?)을 사용하여 while 루프에서 해당 프로세스를 중지하려는 경우 kill 파일을 어딘가에 놓을 수 있습니다 in/tmp와 프로세스는 pclose을 사용하여 파일을 삭제 한 다음 kill 파일을 지울 것입니다. 또한 서버 데몬에서 한 번에 하나의 특정 프로세스 만 실행되도록하려면 프로세스를 시작하기 전에이 작업을 수행해야합니다.