[英]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.