【问题标题】:Duplicate reception of message when reconnecting a socket重新连接套接字时重复接收消息
【发布时间】:2012-04-19 12:20:36
【问题描述】:

我在使用简单的 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;
}

【问题讨论】:

  • 如果您的问题已得到解答,或者不再有效,请“打勾”以选择最合适的答案,以便所有人都知道问题已得到解决。谢谢。

标签: java android sockets bufferedreader


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-08-14
    • 2021-03-30
    • 2017-07-21
    • 2023-02-11
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多