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