简体   繁体   English

GCDAsyncSocket服务器仅首次接收数据

[英]GCDAsyncSocket server receive data only first time

Client sent message every time when I press send button but Server receive message only first time. 每次按下发送按钮但客户端第一次收到消息时,客户端都会发送消息。 What is the issue in server 服务器有什么问题

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

}

Client: 客户:

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

}

You have to make a read call from your server class in didReadData: delegate. 您必须在didReadData: delegate中从服务器类进行读取调用。 Rest is fine. 休息很好。 Use below code. 使用以下代码。

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

so after struggling with this for a bit, I came up with the following pattern for digesting data. 所以经过一段时间的努力,我想出了以下消化数据的模式。 Though the below is an over simplification, it is easily ported to different tasks: 虽然以下是过度简化,但它很容易移植到不同的任务:

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

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM