JAVA套接字实现两次写入后的断开连接
PC中使用JAVA io.socket的应用程序,它将json发送到局域网TCP上的服务器设备ESP8266 当您连接并从java执行断开连接序列时,一切都正常 java是客户端,设备是服务器,当设备切断连接时,让我们在本地主机上使用Hercules,java程序不会被注意到,当我尝试使用outputstreamwriter编写时,它不会触发异常,在服务器断开连接后,至少两次写入套接字后将执行异常,服务器未接收到的最后两次写入将返回成功!在java中。我读过其他程序员使用字节发送来查看连接是否仍然有效。同样的问题也存在。如果我每隔20秒发送两次write,那么在java realize服务器断开连接之前的60秒,如果我每隔1秒发送一次,那么将会有大量的ATcommand中断,而这一切都是徒劳的 这是我的密码:JAVA套接字实现两次写入后的断开连接,java,sockets,server,connection,Java,Sockets,Server,Connection,PC中使用JAVA io.socket的应用程序,它将json发送到局域网TCP上的服务器设备ESP8266 当您连接并从java执行断开连接序列时,一切都正常 java是客户端,设备是服务器,当设备切断连接时,让我们在本地主机上使用Hercules,java程序不会被注意到,当我尝试使用outputstreamwriter编写时,它不会触发异常,在服务器断开连接后,至少两次写入套接字后将执行异常,服务器未接收到的最后两次写入将返回成功!在java中。我读过其他程序员使用字节发送来查看连接是否仍
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。从那以后,每当我想写连接是否存在时,我都会检查,这对我来说非常有效,我实际上通过了那部分代码,可能应该在给出一个点之前测试它!。比你说的没什么好!读取超时不会“看到断开连接”。没有断开的连接。它看到的是在超时时间内没有数据到达,这包括断开连接。如果在超时期间发生断开连接,则不会出现超时。