Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重新连接插座时重复接收信息_Java_Android_Sockets_Bufferedreader - Fatal编程技术网

Java 重新连接插座时重复接收信息

Java 重新连接插座时重复接收信息,java,android,sockets,bufferedreader,Java,Android,Sockets,Bufferedreader,我在使用一个简单的java套接字客户端时遇到了问题:连接建立正确,服务器和客户端都接收和发送数据。当客户端失去连接几秒钟后,套接字将完成并重新建立。这样做是正常的,但在那一刻,客户端最后接收到的消息(在重新连接之前)再次被接收(同一消息的两次接收)而没有任何原因 我的代码是: 要启动套接字,请执行以下操作: 读取数据: 当连接断开时: 如何重新建立套接字连接?在这个阶段我可以看到两种可能性 在重新创建连接之前,您没有完全删除所有“旧”引用。您是否正在创建全新的插座缓冲读取器输入阅读器线程?等等。

我在使用一个简单的java套接字客户端时遇到了问题:连接建立正确,服务器和客户端都接收和发送数据。当客户端失去连接几秒钟后,套接字将完成并重新建立。这样做是正常的,但在那一刻,客户端最后接收到的消息(在重新连接之前)再次被接收(同一消息的两次接收)而没有任何原因

我的代码是:

要启动套接字,请执行以下操作:

读取数据:

当连接断开时:


如何重新建立套接字连接?在这个阶段我可以看到两种可能性

  • 在重新创建连接之前,您没有完全删除所有“旧”引用。您是否正在创建全新的
    插座
    <代码>缓冲读取器<代码>输入阅读器线程?等等。如果有您尚未重新创建的内容,它可能会保留以前的值。如果您正在重用
    IncomingReader
    而不是创建一个新的,那么它可能仍然保留旧的值

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


  • 基本上,您需要尽可能确保当连接中断时,客户端和服务器上与连接相关的所有内容都完全关闭,并使用新对象重新创建。如果所有内容都是一个新对象,则不可能有任何旧数据挂在周围来混淆事物。

    如果您的问题已得到回答,或者不再有效,请“勾选”以选择最合适的答案,以便所有人都知道问题已解决。谢谢
    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;
    }