JAVA套接字实现两次写入后的断开连接

JAVA套接字实现两次写入后的断开连接,java,sockets,server,connection,Java,Sockets,Server,Connection,PC中使用JAVA io.socket的应用程序,它将json发送到局域网TCP上的服务器设备ESP8266 当您连接并从java执行断开连接序列时,一切都正常 java是客户端,设备是服务器,当设备切断连接时,让我们在本地主机上使用Hercules,java程序不会被注意到,当我尝试使用outputstreamwriter编写时,它不会触发异常,在服务器断开连接后,至少两次写入套接字后将执行异常,服务器未接收到的最后两次写入将返回成功!在java中。我读过其他程序员使用字节发送来查看连接是否仍

PC中使用JAVA io.socket的应用程序,它将json发送到局域网TCP上的服务器设备ESP8266

当您连接并从java执行断开连接序列时,一切都正常

java是客户端,设备是服务器,当设备切断连接时,让我们在本地主机上使用Hercules,java程序不会被注意到,当我尝试使用outputstreamwriter编写时,它不会触发异常,在服务器断开连接后,至少两次写入套接字后将执行异常,服务器未接收到的最后两次写入将返回成功!在java中。我读过其他程序员使用字节发送来查看连接是否仍然有效。同样的问题也存在。如果我每隔20秒发送两次write,那么在java realize服务器断开连接之前的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处理套接字的类,而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;
}

你不能。这就是TCP的工作原理。好吧,解决问题,几分钟后发布。读取超时不能解决立即写入失败的问题。也不表示连接已断开。它可以看到断开连接并将布尔值设置为false。从那以后,每当我想写连接是否存在时,我都会检查,这对我来说非常有效,我实际上通过了那部分代码,可能应该在给出一个点之前测试它!。比你说的没什么好!读取超时不会“看到断开连接”。没有断开的连接。它看到的是在超时时间内没有数据到达,这包括断开连接。如果在超时期间发生断开连接,则不会出现超时。