簡體   English   中英

JAVA SOCKET實現兩次寫入后斷開連接

[英]JAVA SOCKET realize disconnect after two writes

使用 JAVA io.socket 的 PC 中的應用程序,它將通過 LAN 網絡將 json 發送到服務器設備 ESP8266on TCP

當您連接並且從 Java 執行斷開連接序列時,它本身一切正常。

java是客戶端,設備是服務器,當設備切斷連接(這里讓我們在本地主機上使用Hercules)時,java程序不會被注意到,當我嘗試用outputstreamwriter編寫時,它不會觸發異常,異常將在至少之后執行服務器斷開連接后對套接字的兩次寫入,服務器未接收到的最后兩次寫入將返回成功! 在爪哇。 我讀過其他程序員使用字節發送來查看連接是否仍然存在。 同樣的問題也存在。 如果我每 20 秒發送兩次寫入,在 Java 意識到服務器斷開連接之前將是 60 秒,如果我每 1 秒發送一次,將會有很多 ATcommand 中斷。

這是我的代碼:

    public boolean Write(String data){
    System.out.println("StartSending");
    if(TESocket.Connected)
    {

        Thread write = new Thread(new Runnable() {
            @Override
            public void run() {
                try
                {
                    outputStreamWriter.write(data);
                    outputStreamWriter.flush();
                }
                catch (IOException e)
                {
                    TESocket.Connected=false;
                    System.out.println("Faild");
                    System.out.println(e.getCause());
                }
            }
        });
        write.start();

        return true;
    }
    else
    {
        System.out.println("Not Connected");
        return false;
    }
}

TESocket 是使用 Runnable 處理 Socket 的類,Connected 是一個靜態布爾值,因為這里一次只有一個套接字是 connect 方法

 public boolean  Connect(){
    Thread connect = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                socket= new Socket("127.0.0.1",Integer.parseInt(port));
                if(socket.isConnected())
                {
                    inputStreamReader  = new InputStreamReader(socket.getInputStream());
                    outputStreamWriter = new OutputStreamWriter(socket.getOutputStream());
                    TESocket.Connected=true;
                    System.out.println("Connected");
                }

            } catch (IOException e) {
                System.out.println("Faild to Connect");
                e.printStackTrace();
            }
        }
    });
    connect.start();
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    if(TESocket.Connected)
        return true;
    else
        return false;
}

如果在發送寫入后立即無法訪問服務器,我如何才能注意到? 或者有沒有注意到這一點的事件? 也許是異步套接字之王? 就像在 QT(斷開連接的信號槽)中一樣

好吧,通過閱讀方法和設置超時解決了這個問題,感謝閱讀一些帖子,如果我仍然連接並且沒有收到任何數據超時將被拋出,這讓我回到了while循環的第一個謊言

如果我收到數據,我將大於零,讀取器將讀取數據並標記 rec=true,因此斷開連接序列不會發生

如果我沒有收到任何數據並且沒有發生超時,則不會拋出 rec=false 和異常,因此程序將斷開例程,將超時設置為 1 毫秒使其在截止日期前實時(與我的工作成比例)檢測

public boolean Read()
{
    if (TESocket.Connected)
    {
        try {
            socket.setSoTimeout(1000);
        } catch (SocketException e) {
            System.out.println("Problem Timeout");
            e.printStackTrace();
        }
        Thread read = new Thread(new Runnable() {
            @Override
            public void run() {
                int i;
                boolean rec=false;
                while (true)
                {
                    char[] reader = new char[250];
                    try {

                            //while(!inputStreamReader.ready());
                            i=inputStreamReader.read(reader);
                            if(i>0) {
                                System.out.println(reader);
                                rec=true;
                            }
                            // Thread.sleep(2500);
                        if(!rec)
                        {
                            System.out.println("Disconnected");
                            TESocket.Connected=false;
                            inputStreamReader.close();
                            outputStreamWriter.close();
                            socket.close();
                            break;
                        }
                        rec=false;

                    }
                    catch (IOException e)
                    {
                        System.out.println("Connected");
                    }
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }
        });
        read.start();
    }
    return true;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM