2011-12-10 58 views
1

我在想如何在Socket客户端上等待ServerSocket连接。如何在客户端上等待ServerSocket连接Socket

当我首先执行服务器(发送)时,它会使用ServerSocket.accept方法等待客户端连接。问题是如果没有先执行服务器,则客户端(接收)无法执行。我想添加一个条件来允许客户端等待来自服务器的连接。可能吗?

SEND(服务器)

ServerSocket servsock = new ServerSocket(1234); 
Socket sock = servsock.accept(); 

接收(客户端)

Socket sock = new Socket(from, 1234); 

ERROR(客户端)

java.net.ConnectException: Connection refused 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) 
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432) 
    at java.net.Socket.connect(Socket.java:529) 
    at java.net.Socket.connect(Socket.java:478) 
    at java.net.Socket.<init>(Socket.java:375) 
    at java.net.Socket.<init>(Socket.java:189) 

谢谢。

回答

2

感谢马特,它的工作原理。

Socket sock = null; 
    while (true) { 
     try { 
     sock = new Socket(from, 1234); 
     if (sock != null) { break; } 
     } 
     catch (IOException e) { Thread.sleep(1000); } 
    } 
    // rest of the code 
+0

'sock'不可能是空的地方,你正在测试它。只是'打破'。 – EJP

4

有没有内置的方式来做到这一点。你必须在客户端捕获异常,并自己实现一个重试机制。

伪代码:

Socket sock = null; 
while (retryCounter < threshold) { 
    try { 
    retryCounter++; 
    sock = new Socket(form, 1234); 
    } catch (...) { 
    // handle exceptions 
    // possibly add a sleep period 
    } 
} 
if (sock == null) { 
    // you failed to connect 
} else { 
    // you're connected 
} 

要小心,如果你有一个GUI:您可能需要实施一些,在一个单独的线程或使用定时器,以避免冻结您的UI。

+0

我应该在catch(...)中添加什么? – Julien

+0

您应该处理您希望重试发生的异常。在发生这种情况时记录某处,如果有“致命”异常(即重试无法解决的异常),请将其保存。这是非常通用的,这完全取决于您的应用程序需要什么。 – Mat

+0

对不起,我不明白。有没有简单的方法,比如发送ping或连接测试? – Julien

相关问题