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

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

  1. 在重新创建连接之前,您并没有完全删除所有“旧”引用。你在创造一个全新的Socket吗?BufferedReader? IncomingReader线?等等。如果您没有重新创建某些东西,它可能会保留以前的值。如果你重用你的IncomingReader而不是创建一个新的,它可能仍然具有旧值。

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

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

于 2012-04-19T13:52:53.043 回答