English 中文(简体)
服务器连接的星座
原标题:asyncsocket ipad doesn t connect to server [closed]

我的申请时间是在试图与东道国联系的时候。 时间是无限的,因此,我认为客户实际上根本无法联系。

我有一台自动电算机,运行合成器和Im,试图将其连接到我的台上的一个服务器上,也使用合成物。 iPad是SOS 5,正在使用GCD作为表格。

服务器正在通过NSRunLoop使用。 它没有从客户那里获得任何形式的联系(不像电话网连接一样发现任何断点)。

能够从其他机器把电网输入服务器的Im只罚款。 I m还能够将iPad客户连接到港口:80只罚款。

我试图将iPad与8080、4500和50000港口的服务器连接起来,但没有成功(所有电话网的工作)。

I believe there is something in the server code causing this but I am not sure.

我的服务器代码来自此处发现的样本:

My client code is modified HTTP client code from the sample GCD code supplied by the asyncsockets repository: https://github.com/robbiehanson/CocoaAsyncSocket/blob/master/Examples/GCD/SimpleHTTPClient/Mobile/SimpleHTTPClient/SimpleHTTPClientAppDelegate.m

Here is my server code:

  - (id) init;
{
    self = [super init];
    if (self != nil)
    {
        debugServer = [[AsyncSocket alloc] initWithDelegate:self];
        connectedClients = [[NSMutableArray alloc] initWithCapacity:1];
        running = false;
    }
    return self;
}

- (void) dealloc;
{
    [self stop];
    [connectedClients release];
    [debugServer release];
    [super dealloc];
}

- (void) startOnPort
{
    if (running) return;

    if (_port < 0 || _port > 65535)
        _port = 0;

    NSError *error = nil;
    if (![debugServer acceptOnPort:_port error:&error])
        return;

    NSLog(@"My Awesome Debug Server has started on port %hu", [debugServer localPort]);

    running = true;
}


- (void) stop;
{
    if (!running) return;

    [debugServer disconnect];
    for (AsyncSocket* socket in connectedClients)
        [socket disconnect]; 

    running = false;
}


- (void) setPort:(int)in_port{
    _port = in_port;
}

- (void)onSocket:(AsyncSocket *)socket didAcceptNewSocket:(AsyncSocket *)newSocket;
{
    [connectedClients addObject:newSocket];
}


- (void)onSocketDidDisconnect:(AsyncSocket *)socket;
{
    [connectedClients removeObject:socket];
}

- (void)onSocket:(AsyncSocket *)socket didConnectToHost:(NSString *)host port:(UInt16)port;
{
    NSLog(@"Accepted client %@:%hu", host, port);

    NSData *welcomeData = [@"Welcome to my Awesome Debug Server

" 
                           dataUsingEncoding:NSUTF8StringEncoding];
    [socket writeData:welcomeData withTimeout:-1 tag:WelcomeMsgTag];

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


- (void)onSocket:(AsyncSocket *)socket didReadData:(NSData *)data withTag:(long)tag;
{
    NSString *tmp = [NSString stringWithUTF8String:[data bytes]];
    NSString *input = [tmp stringByTrimmingCharactersInSet:
                       [NSCharacterSet whitespaceAndNewlineCharacterSet]];

    NSLog(@"%@",input);

    if ([input isEqualToString:@"exit"])
    {
        NSData *byeData = [@"Bye!
" dataUsingEncoding:NSUTF8StringEncoding];
        [socket writeData:byeData withTimeout:-1 tag:GenericMsgTag];
        [socket disconnectAfterWriting];
        return;
    }

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

@end

...and here is my client code:

- (id) init
{
    if (self = [super init]) {
    // AsyncSocket optionally uses the Lumberjack logging framework.
    // 
    // Lumberjack is a professional logging framework. It s extremely fast and flexible.
    // It also uses GCD, making it a great fit for GCDAsyncSocket.
    // 
    // As mentioned earlier, enabling logging in GCDAsyncSocket is entirely optional.
    // Doing so simply helps give you a deeper understanding of the inner workings of the library (if you care).
    // You can do so at the top of GCDAsyncSocket.m,
    // where you can also control things such as the log level,
    // and whether or not logging should be asynchronous (helps to improve speed, and
    // perfect for reducing interference with those pesky timing bugs in your code).
    // 
    // There is a massive amount of documentation on the Lumberjack project page:
    // https://github.com/CocoaLumberjack/CocoaLumberjack
    // 
    // But this one line is all you need to instruct Lumberjack to spit out log statements to the Xcode console.

    [DDLog addLogger:[DDTTYLogger sharedInstance]];

    // Create our GCDAsyncSocket instance.
    // 
    // Notice that we give it the normal delegate AND a delegate queue.
    // The socket will do all of its operations in a background queue,
    // and you can tell it which thread/queue to invoke your delegate on.
    // In this case, we re just saying invoke us on the main thread.
    // But you can see how trivial it would be to create your own queue,
    // and parallelize your networking processing code by having your
    // delegate methods invoked and run on background queues.

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

    // Now we tell the ASYNCHRONOUS socket to connect.
    // 
    // Recall that GCDAsyncSocket is ... asynchronous.
    // This means when you tell the socket to connect, it will do so ... asynchronously.
    // After all, do you want your main thread to block on a slow network connection?
    // 
    // So what s with the BOOL return value, and error pointer?
    // These are for early detection of obvious problems, such as:
    // 
    // - The socket is already connected.
    // - You passed in an invalid parameter.
    // - The socket isn t configured properly.
    // 
    // The error message might be something like "Attempting to connect without a delegate. Set a delegate first."
    // 
    // When the asynchronous sockets connects, it will invoke the socket:didConnectToHost:port: delegate method.

    NSError *error = nil;

#if USE_SECURE_CONNECTION
    uint16_t port = 443; // HTTPS
#else
    uint16_t port = 8080;  // HTTP
#endif

    DDLogVerbose(@"port: %d	 host: %@",port,@"130.85.92.12");

    if (![asyncSocket connectToHost:@"130.85.92.12" onPort:port error:&error])
    {
        DDLogError(@"Unable to connect to due to invalid configuration: %@", error);
    }
    else
    {
        DDLogVerbose(@"Connecting...");
    }

#if USE_SECURE_CONNECTION

    // The connect method above is asynchronous.
    // At this point, the connection has been initiated, but hasn t completed.
    // When the connection is establish, our socket:didConnectToHost:port: delegate method will be invoked.
    // 
    // Now, for a secure connection we have to connect to the HTTPS server running on port 443.
    // The SSL/TLS protocol runs atop TCP, so after the connection is established we want to start the TLS handshake.
    // 
    // We already know this is what we want to do.
    // Wouldn t it be convenient if we could tell the socket to queue the security upgrade now instead of waiting?
    // Well in fact you can! This is part of the queued architecture of AsyncSocket.
    // 
    // After the connection has been established, AsyncSocket will look in it s queue for the next task.
    // There it will find, dequeue and execute our request to start the TLS security protocol.
    // 
    // The options passed to the startTLS method are fully documented in the GCDAsyncSocket header file.
    // The deusty server only has a development (self-signed) X.509 certificate.
    // So we tell it not to attempt to validate the cert (cause if it did it would fail).

    NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO]
                                                        forKey:(NSString *)kCFStreamSSLValidatesCertificateChain];

    [asyncSocket startTLS:options];

#endif
    }

    return self;
}

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
    DDLogVerbose(@"socket:didConnectToHost:%@ port:%hu", host, port);

    // HTTP is a really simple protocol.
    // 
    // If you don t already know all about it, this is one of the best resources I know (short and sweet):
    // http://www.jmarshall.com/easy/http/
    // 
    // We re just going to tell the server to send us the metadata (essentially) about a particular resource.
    // The server will send an http response, and then immediately close the connection.

    NSString *msg = @"iOS client connected

";
    NSData *msgdata = [msg dataUsingEncoding:NSUTF8StringEncoding];

    [asyncSocket writeData:msgdata withTimeout:-1.0 tag:0];

    // Side Note:
    // 
    // The AsyncSocket family supports queued reads and writes.
    // 
    // This means that you don t have to wait for the socket to connect before issuing your read or write commands.
    // If you do so before the socket is connected, it will simply queue the requests,
    // and process them after the socket is connected.
    // Also, you can issue multiple write commands (or read commands) at a time.
    // You don t have to wait for one write operation to complete before sending another write command.
    // 
    // The whole point is to make YOUR code easier to write, easier to read, and easier to maintain.
    // Do networking stuff when it is easiest for you, or when it makes the most sense for you.
    // AsyncSocket adapts to your schedule, not the other way around.

#if READ_HEADER_LINE_BY_LINE

    // Now we tell the socket to read the first line of the http response header.
    // As per the http protocol, we know each header line is terminated with a CRLF (carriage return, line feed).

    [asyncSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1.0 tag:0];
#else

    // Now we tell the socket to read the full header for the http response.
    // As per the http protocol, we know the header is terminated with two CRLF s (carriage return, line feed).

    [asyncSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1.0 tag:0];

#endif
}

- (void)socketDidSecure:(GCDAsyncSocket *)sock
{
    // This method will be called if USE_SECURE_CONNECTION is set

    DDLogVerbose(@"socketDidSecure:");
}

- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
{
    DDLogVerbose(@"socket:didWriteDataWithTag:");
}

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

    NSString *httpResponse = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    NSLog(@"%@",httpResponse);

#if READ_HEADER_LINE_BY_LINE

    DDLogInfo(@"Line httpResponse: %@", httpResponse);

    // As per the http protocol, we know the header is terminated with two CRLF s.
    // In other words, an empty line.

    if ([data length] == 2) // 2 bytes = CRLF
    {
        DDLogInfo(@"<done>");
    }
    else
    {
        // Read the next line of the header
        [asyncSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:-1.0 tag:0];
    }

#else

    DDLogInfo(@"Full httpResponse: %@", httpResponse);

#endif

    [httpResponse release];
}

- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
    // Since we requested HTTP/1.0, we expect the server to close the connection as soon as it has sent the response.

    DDLogVerbose(@"socketDidDisconnect:withError: "%@"", err);
}

我在寻找答案,但没有成功。 我所看到的最佳行动方向是请大家,而不是 w击我试图自己解决问题的人才。

最佳回答

解决办法是以不同方式连接当地网络。 我的运行是一个网络,需要一个当地接入的标识,但为广域网接入提供了“用户”链接。 该装置(iPad)自动连接为“顾问”,我需要人工记录。

因此,如果你能够把大街连接起来,就会检查你与网络的联系方式!

问题回答

暂无回答




相关问题
List Contents of Directory in a UITableView

I am trying to list the contents of Ringtones directory in a TableView, however, I am only getting the last file in the directory in ALL cells, instead of file per cell. This is my code: - (...

iPhone NSUserDefaults persistance difficulty

In my app i have a bunch of data i store in the NSUserdefaults. This information consists of an NSObject (Object1) with NSStrings and NSNumbers and also 2 instances of yet another object (Object2). ...

Writing a masked image to disk as a PNG file

Basically I m downloading images off of a webserver and then caching them to the disk, but before I do so I want to mask them. I m using the masking code everyone seems to point at which can be found ...

Resize UIImage with aspect ratio?

I m using this code to resize an image on the iPhone: CGRect screenRect = CGRectMake(0, 0, 320.0, 480.0); UIGraphicsBeginImageContext(screenRect.size); [value drawInRect:screenRect blendMode:...

Allowing interaction with a UIView under another UIView

Is there a simple way of allowing interaction with a button in a UIView that lies under another UIView - where there are no actual objects from the top UIView on top of the button? For instance, ...

热门标签