小编Art*_*hur的帖子

使用SSLSocket的TLS连接在Android OS中很慢

我正在开发一个使用SSLSocket连接到服务器的Android应用程序.这是我正在使用的代码:

// Connect
if (socket == null || socket.isClosed() || !socket.isConnected()) {
    if (socket != null && !socket.isClosed())
        socket.close();
    Log.i(getClass().toString(), "Connecting...");
    if (sslContext == null) {
        sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, trustAllCerts, new SecureRandom()); 
    }
    SSLSocketFactory socketFactory = sslContext.getSocketFactory();
    socket = (SSLSocket)socketFactory.createSocket(host, port);
    socket.setSoTimeout(20000);
    socket.setUseClientMode(true);
    connected = true;
    Log.i(getClass().toString(), "Connected.");
}

// Secure
if (connected) {
    Log.i(getClass().toString(), "Securing...");
    SSLSession session = socket.getSession();
    secured = session.isValid();
    if (secured) {
        Log.i(getClass().toString(), "Secured.");
    }
    else
        Log.i(getClass().toString(), "Securing failed.");
}
Run Code Online (Sandbox Code Playgroud)

问题是在下面的行中进行TLS握手需要大约5秒或更多事件:

SSLSession session = socket.getSession(); …
Run Code Online (Sandbox Code Playgroud)

java sockets ssl android

10
推荐指数
2
解决办法
1万
查看次数

在iPhone上使用AsyncSocket和辅助线程

我在iPhone上使用AsyncSocket与服务器通信.AsyncSocket基于运行循环,但我的应用程序基于线程.这意味着,我启动一个新线程来写入数据,并等待直到在同一个线程上收到响应.但我不能直接从另一个线程调用AsyncSocket的方法,我必须使用:

[self performSelectorOnMainThread:@selector(writeSomeData:) withObject:dataToWrite waitUntilDone:YES];
Run Code Online (Sandbox Code Playgroud)

它确实有效,但我无法通过这种方式调用我的方法"writeSomeData:",因为performSelectorOnMainThread不返回任何内容.

方法writeSomeData:做这样的事情:

-(NSData *)writeData:(NSData *)dataToWrite {
    dataReceived = nil; // AsyncSocket writes data to this variable
    [asyncSocket writeData:dataToWrite withTimeout:-1 tag:0];
    [asyncSocket readDataToData:[@"<EOF" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0];
    int counter = 0;
    while (dataReceived == nil && counter < 5) {
        // runLoop is [NSRunLoop currentRunloop]
        [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.3]];
        ++counter;
    }

    return [dataReceived copy];
}
Run Code Online (Sandbox Code Playgroud)

我可以通过访问类变量"dataReceived"获得响应,但此时内容已更改.

任何人都可以告诉我如何在不同的线程上使用AsyncSocket(或者一般来说,如何处理基于运行循环的类),这样如果我调用该类的方法,它会一直阻塞,直到执行该方法并收到响应?

谢谢.

iphone cocoa-touch asyncsocket nsthread nsrunloop

5
推荐指数
1
解决办法
1326
查看次数

标签 统计

android ×1

asyncsocket ×1

cocoa-touch ×1

iphone ×1

java ×1

nsrunloop ×1

nsthread ×1

sockets ×1

ssl ×1