1

単純な 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;
}
4

1 に答える 1

0

ソケット接続をどのように再確立していますか? この段階で 2 つの可能性が見えます...

  1. 接続を再作成する前に、すべての「古い」参照を完全に削除していません。あなたは真新しいを作成していますSocketか?BufferedReader? IncomingReaderスレッド?などなど、作り直していないものがあるとしたら、それは以前の値にしがみついている可能性があります。IncomingReader新しいものを作成するのではなく、再利用している場合は、古い値が保持されている可能性があります。

  2. 接続が閉じている場合、サーバー側でどのように処理していますか? サーバーがクライアントに情報を送信しようとしたときに接続が切断された場合、接続が再確立されると、サーバーは最後のメッセージを再送信しようとする場合があります。別の可能性として、接続が切断されたときにサーバーが接続を close() しない場合、サーバーも古いデータを保持している可能性があります。

基本的に、接続が切断されたときに、クライアントとサーバーの両方の接続に関連するすべてが完全に閉じられ、新しいオブジェクトを使用して再作成されるようにする必要があります。すべてが新しいオブジェクトである場合、古いデータがぶら下がって物事を混乱させる可能性はありません。

于 2012-04-19T13:52:53.043 に答える