2014-09-11 3 views
6

클라이언트는 보내기 버튼을 누를 때마다 메시지를 보내지 만 서버는 메시지를 처음 수신합니다. 서버에 문제가 무엇입니까GCDAsyncSocket 서버는 처음으로 데이터를 수신합니다.

서버 :

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; 

    NSError *err = nil; 
    if (![asyncSocket acceptOnPort:10000 error:&err]){ 

     NSLog(@"Error in acceptOnPort:error: -> %@", err); 

    } 
} 

- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket 
{ 
    NSLog(@"Accepted new socket from %@:%hu", [newSocket connectedHost], [newSocket connectedPort]); 

    self.asyncSocket = newSocket; 
    NSString *welcomMessage = @"Hello from the server\r\n"; 
    [self.asyncSocket writeData:[welcomMessage dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:1]; 

    [self.asyncSocket readDataWithTimeout:-1 tag:0]; 

} 

-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{ 
    NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

    NSLog(@"MSG: %@",msg); 

} 

클라이언트 :

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; 
    [socket setDelegate:self]; 

} 

-(IBAction)connectToServer { 
    NSError *err = nil; 
    if (![socket connectToHost:self.txtIp.text onPort:10000 error:&err]) // Asynchronous! 
    { 
     // If there was an error, it's likely something like "already connected" or "no delegate set" 
     NSLog(@"I goofed: %@", err); 
     return; 
    } 
} 

- (void)socket:(GCDAsyncSocket *)sender didConnectToHost:(NSString *)host port:(UInt16)port 
{ 
    NSLog(@"Cool, I'm connected! That was easy."); 

    [socket readDataWithTimeout:-1 tag:0]; 
} 

- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag 
{ 
    if (tag == 1) 
     NSLog(@"First request sent"); 
    else if (tag == 2) 
     NSLog(@"Second request sent"); 
} 

- (void)socket:(GCDAsyncSocket *)sender didReadData:(NSData *)data withTag:(long)tag 
{ 
    NSLog(@"Received Data: %@",data); 
} 


-(void)sendMessage { 

    NSData *msg = [self.txtMsg.text dataUsingEncoding:NSUTF8StringEncoding]; 

    NSLog(@"Data Send: %@",msg); 

    [socket writeData:msg withTimeout:-1 tag:1]; 

} 
+0

처음으로 서버에서 _ 메시지를 수신 했습니까? 아니면 새 소켓 연결 시도의 결과로 전화 한 것입니까? 나는 당신이 연결 호출을 받고 클라이언트가 환영 메시지를 받아야한다고 믿습니다. 그 후에는 서버 측에서 수신을하지 않습니다. 이것을 확인하면 뭔가 제안 할 수 있습니다. – Gandalf

+0

@ 간달프 : 감사합니다. 클라이언트가 환영 메시지를 받고 클라이언트가 메시지를 보낼 때 첫 번째 메시지 만 서버를받을 수 있습니다. 클라이언트의 다른 메시지가 성공을 보냈지 만 서버는 수신 할 수 없습니다. – Salim

+1

코드를 사용하지만 서버에 연결할 수 없습니다. 처음에는. @ "localhost"를 매개 변수로 사용합니까? –

답변

5

당신은 didReadData에 서버 클래스에서 읽기 호출을해야 : 위임. 나머지는 괜찮습니다. 아래 코드를 사용하십시오.

-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag { 

    [sock readDataWithTimeout:-1 tag:0]; 

    NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSLog(@"MSG: %@",msg); 
} 
+0

그것은 저에게 효과적이지 않습니다. –

+0

@Coder_A_D - 동일한 코드 설정을 사용 하시겠습니까? 코드에 몇 가지 다른 점이있을 수 있습니다. 작동하지 않는 경우 문제가 무엇인지 알려주십시오. 대답을 곧바로 투표하는 논리는 아닙니다. – Gandalf

+1

대단히 감사합니다. –

0

그래서 약간의 고민 끝에 다음 데이터 패턴을 생각해 냈습니다. 아래의 내용은 단순화되었지만 다른 작업으로 쉽게 이식 할 수 있습니다.

Somewhat Swift Solution 

var dataCache = Data() 

func socket(_ sock: GCDAsyncSocket, didConnectToHost host: String, port: UInt16) { 
    sock.readData(withTimeout: -1, tag: 0) 
} 

func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) { 
    dataCache.append(data) 
    sock.readData(withTimeout: -1, tag: 0) 
} 

func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) { 
    print("Closed with error: \(err)") 
    processData() 
} 

func socketDidCloseReadStream(_ sock: GCDAsyncSocket) { 
    print("Closed successfully") 
    processData() 
} 

func processData() { 
    // Do something with dataCache eg print it out: 
    print("The following read payload:\(String(data:dataCache, encoding: .utf8) ?? "Read data invalid")") 
    dataCache = Data() 

}