2014-09-11 27 views
6

Tin nhắn được gửi của khách hàng mỗi khi tôi nhấn nút gửi nhưng Máy chủ chỉ nhận được tin nhắn lần đầu tiên. vấn đề này là gì trong máy chủMáy chủ GCDAsyncSocket chỉ nhận dữ liệu lần đầu tiên

Server:

- (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); 

} 

Chủ đầu tư:

- (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

Bạn có nhận được _message_ tại máy chủ lần đầu hay chỉ là cuộc gọi do kết nối của ổ cắm mới? Tôi tin rằng bạn đang nhận được cuộc gọi kết nối và sau đó khách hàng sẽ nhận được thông báo chào mừng. Sau đó sẽ không có bất kỳ tiếp nhận ở phía máy chủ. Xác nhận điều này và tôi có thể thử đề xuất điều gì đó. – Gandalf

+0

@Gandalf: cảm ơn, khách hàng nhận được thông báo chào mừng và khi khách hàng gửi tin nhắn, tin nhắn đầu tiên chỉ có thể nhận được máy chủ. Tin nhắn khác của khách hàng đã gửi thành công nhưng máy chủ không thể nhận được. – Salim

+1

Sử dụng mã của bạn nhưng không thể kết nối với máy chủ. Không, ngay cả ở lần đầu tiên. Bạn có sử dụng @ "localhost" làm tham số không? –

Trả lời

5

Bạn phải thực hiện một cuộc gọi đọc từ lớp máy chủ của bạn trong didReadData: đại biểu. Phần còn lại là tốt. Sử dụng mã dưới đây.

-(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

Nó không hoạt động đối với tôi. –

+0

@Coder_A_D - Bạn có chắc là bạn có cùng một thiết lập mã với bạn không? Có thể có một số khác biệt khác trong mã của bạn. Nếu nó không làm việc cho bạn cho chúng tôi biết bạn đang gặp phải vấn đề gì. Đó không phải là logic của bỏ phiếu xuống một câu trả lời ngay lập tức? – Gandalf

+1

hoạt động rất tốt nhờ –

0

vì vậy sau khi đấu tranh với điều này một chút, tôi đã đưa ra mẫu sau để phân tích dữ liệu. Mặc dù dưới đây là một quá đơn giản hóa, nó dễ dàng được chuyển đến các tác vụ khác nhau:

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() 

} 
Các vấn đề liên quan