繁体   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