重新连接套接字时重复接收消息

时间:2012-04-19 12:20:37

标签: java android sockets bufferedreader

我遇到一个简单的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;
}

1 个答案:

答案 0 :(得分:0)

您是如何重新建立Socket连接的?在这个阶段我可以看到两种可能性......

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

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

  3. 基本上,尽可能地,您需要确保在连接中断时,与客户端和服务器上的连接相关的所有内容都将完全关闭并使用新对象重新创建。如果一切都是新的对象,那么就不可能有任何旧数据混淆。