2012-04-19 157 views
0

我遇到了一个简单的java套接字客户端问题:连接已正确建立,服务器和客户端都接收和发送数据。当客户端失去连接几秒钟后,套接字完成并重新建立。这一切都没问题,但在那一刻,客户端最后收到的消息(重新连接之前)再次被接收(2次接收同一消息),没有任何理由。重新连接套接字时重复接收邮件

我的代码是:

要启动插座:

Socket sock = new Socket(); 
sock.bind(null); 
InetSocketAddress isa = new InetSocketAddress(serverIPAddress,serverPort); 
sock.connect(isa, conectionTimeOut); 
sock.setKeepAlive(true); 

InputStreamReader isR = new InputStreamReader(sock.getInputStream(), "UTF8"); 
reader = new BufferedReader(isR); 

out = new BufferedWriter(new OutputStreamWriter(
    sock.getOutputStream(), "UTF8")); 

读取数据:

public class IncomingReader implements Runnable { 
    String message = ""; 

    @Override 
    public void run() { 
     Thread thisThread = Thread.currentThread(); 
     while (readerThread == thisThread) { 
      try { 
       while ((message = reader.readLine()) != null) { 
        manageServerMessage(message); 
       } 
      } catch (IOException e) { 
       Log.d(General.TAG, e.getMessage()+" "+e.getCause()); 
      } 
     } 

当连接丢失:

public void stopSocket() { 
    readerThread = null; 
    try{ 
     if (reader != null){ 
      reader.close(); 
      reader=null; 
     } 
    } catch (IOException e) { 
     Log.d(General.TAG, e.getMessage()+" "+e.getCause()); 
    } 
    try{ 
     if (out != null) 
      out.close(); 
    } catch (IOException e) { 
     Log.d(General.TAG, e.getMessage()+" "+e.getCause()); 
    } 
    try{ 
     if (sock != null){ 
      sock.close(); 
      sock=null; 
     } 
    } catch (IOException e) { 
     Log.d(General.TAG, e.getMessage()+" "+e.getCause()); 
     sock=null; 
    } 
    readerThread = null; 
} 
+0

如果您的问题已得到解答,或者不再有效,请勾选以选择最合适的答案,以便大家都知道问题已得到解决。谢谢。 – wattostudios 2012-05-14 13:42:27

回答

0

你如何重建你的Socket连接?在这个阶段我可以看到2种可能性...

  1. 在重新创建连接之前,您没有完全删除所有“旧”引用。你正在创建一个全新的SocketBufferedReaderIncomingReader线程?等等。如果有些东西没有被重新创建,它可能会保持之前的值。如果您正在重复使用您的IncomingReader而不是创建一个新的,它可能仍然具有旧的价值。

  2. 如果连接已关闭,您如何在服务器端处理它?如果您的服务器尝试向客户端发送信息,但连接中断,则服务器可能会尝试在重新建立连接后重新发送最后一条消息。另一种可能性是,如果服务器在连接断开时不关闭()连接,它也可能会保留一些旧数据。

基本上,作为最好的,你可以,你需要确保的是,当连接中断,涉及到在客户端和服务器的连接一切都是完全封闭,并使用新的对象重建。如果一切都是新的对象,那么就不可能有任何旧数据混淆在一起来混淆事物。