Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 套接字客户端断开连接时的无限循环_Java_Multithreading_Sockets_Null_Serversocket - Fatal编程技术网

Java 套接字客户端断开连接时的无限循环

Java 套接字客户端断开连接时的无限循环,java,multithreading,sockets,null,serversocket,Java,Multithreading,Sockets,Null,Serversocket,我已经实现了一个Java多线程套接字服务器。它工作正常,为每个新的客户端连接创建一个新线程。但是我有一个错误,当客户端切断TCP连接时,服务器进入一个无限循环,每个循环我都会收到以下消息: ERROR : Bad Frame !!! : null 我试图调试执行并更改if-else条件,但当客户端断开连接时,始终存在相同的错误 这是我的服务器代码 public class TCPSockServer implements Runnable { Socket sock; st

我已经实现了一个Java多线程套接字服务器。它工作正常,为每个新的客户端连接创建一个新线程。但是我有一个错误,当客户端切断TCP连接时,服务器进入一个无限循环,每个循环我都会收到以下消息:

ERROR : Bad Frame  !!! : null
我试图调试执行并更改
if-else
条件,但当客户端断开连接时,始终存在相同的错误

这是我的服务器代码

public class TCPSockServer implements Runnable {

    Socket sock;
    static int counter = 0;
    private static int TIMEOUT = 50000;
    private static int MAX_TIMEOUT = 100000;
    long lastReadTime;


    public TCPSockServer(Socket sock) {
        this.sock = sock;
    }


    public static void main(String[] args) {


        try {
            ServerSocket serverSock = new ServerSocket(12000);

            System.out.println("TCPSockServer : Listening to PORT 12000 ...");

            while (true) {
                Socket newSock = serverSock.accept();
                counter++;
                InetAddress addr = newSock.getInetAddress();
                System.out.println("TCPSockServer : Connection Number : "+ counter);
                System.out.println("TCPSockServer : Connection made to "
                        + addr.getHostName() + " : (" + addr.getHostAddress()
                        + ")");
                newSock.setSoTimeout(TIMEOUT);
                newSock.setKeepAlive(true);
                new Thread(new TCPSockServer(newSock)).start();
            }

        } catch (IOException e) {
            System.err.println("Trackiz: Main : ERROR Connection Failed");
            e.printStackTrace();
        }

    }

    @Override
    public void run() {

        int clientID = counter;
        try {

            BufferedReader inStream = new BufferedReader(new InputStreamReader(
                    sock.getInputStream()));
            StringBuilder inString = new StringBuilder();
            String frame = null;
            PrintStream outStream = new PrintStream(sock.getOutputStream());

            while (true) {
                if (inString.append((String) inStream.readLine()) == null) {
                    System.out.println("TCPSockServer : CLIENT NOT CONNECTED");
                    sock.close();
                    break;
                } else {
                    lastReadTime = System.currentTimeMillis();
                    frame = inString.toString();

                    if (cond1(frame)) {
                        ......
                    }else{
                     system.err.println("\nERROR : Bad Frame  !!! : "+frame); // why it enter this else in an infinit loop
                    }
                    outStream.println(provt.sendCommand("TCPSockServer : ACK TO CLIENT"));
                    inString = null;
                    inString = new StringBuilder();

                }
            }
            inStream.close();
            outStream.close();
            sock.close();

        } catch (SocketTimeoutException e) {
            if (!isConnectionAlive()) {
                System.out.println("\nCONNECTION TERMINATED FROM CLIENT !"
                        + clientID);
                logger.log(Level.SEVERE, "TCPSockServer : Connection terminated with Client");
                try {
                    sock.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            } else {
                // TODO sendHeartBeat(); 
                System.out.println("Sending HeartBeat ...");
            }

            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("TCPSockServer : Connection Timeout. Try to reconnect !");
            e.printStackTrace();
        }   

    }

    public boolean isConnectionAlive() {
        return System.currentTimeMillis() - lastReadTime < MAX_TIMEOUT;
    }

}
公共类TCPSockServer实现可运行{
插座;
静态整数计数器=0;
私有静态int超时=50000;
私有静态int MAX_TIMEOUT=100000;
长时间;
公共TCPSockServer(套接字sock){
this.sock=sock;
}
公共静态void main(字符串[]args){
试一试{
ServerSocket serverSock=新的ServerSocket(12000);
System.out.println(“TCPSockServer:侦听端口12000…”);
while(true){
Socket newSock=serverSock.accept();
计数器++;
InetAddress addr=newSock.getInetAddress();
System.out.println(“TCPSockServer:连接号:”+计数器);
System.out.println(“TCPSockServer:连接到”
+addr.getHostName()+:(“+addr.getHostAddress())
+ ")");
newstock.setSoTimeout(超时);
newstock.setKeepAlive(true);
新线程(新TCPSockServer(newSock)).start();
}
}捕获(IOE异常){
System.err.println(“Trackiz:Main:错误连接失败”);
e、 printStackTrace();
}
}
@凌驾
公开募捐{
int clientID=计数器;
试一试{
BufferedReader inStream=新的BufferedReader(新的InputStreamReader(
getInputStream());
StringBuilder inString=新的StringBuilder();
字符串帧=空;
PrintStream outStream=新的PrintStream(sock.getOutputStream());
while(true){
if(inString.append((字符串)inStream.readLine())==null){
System.out.println(“TCPSockServer:客户端未连接”);
sock.close();
打破
}否则{
lastReadTime=System.currentTimeMillis();
frame=inString.toString();
if(cond1(帧)){
......
}否则{
system.err.println(“\n错误:坏帧!!!:”+Frame);//为什么它在无限循环中输入此值
}
exptream.println(prov.sendCommand(“TCPSockServer:ACK TO CLIENT”);
inString=null;
inString=新的StringBuilder();
}
}
流内关闭();
exptream.close();
sock.close();
}捕获(SocketTimeoutException e){
如果(!isConnectionAlive()){
System.out.println(“\n从客户端终止连接!”
+clientID);
logger.log(Level.severy,“TCPSockServer:与客户端的连接终止”);
试一试{
sock.close();
}捕获(IOE1异常){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
}否则{
//TODO sendHeartBeat();
System.out.println(“发送心跳…”);
}
e、 printStackTrace();
}捕获(IOE异常){
System.err.println(“TCPSockServer:连接超时。尝试重新连接!”);
e、 printStackTrace();
}   
}
公共布尔值isConnectionAlive(){
return System.currentTimeMillis()-lastReadTime
append方法将永远不会返回
null
,因此这是不对的,将永远不会输入
if
-分支:

  if (inString.append((String) inStream.readLine()) == null) {
代码可能更像这样:

  String line = inStream.readLine();
  if (line == null) {
      ...
  } else {
      inString.append(line);
      ...
  }

append
方法将永远不会返回
null
,因此这是不对的,将永远不会输入
if
-分支:

  if (inString.append((String) inStream.readLine()) == null) {
代码可能更像这样:

  String line = inStream.readLine();
  if (line == null) {
      ...
  } else {
      inString.append(line);
      ...
  }

我不是那个意思。我谈到这个问题:if(cond1(frame)){……}else{system.err.println(“\n错误:坏帧!!!:”+frame);}///我不知道它为什么输入else并在无限循环中打印“Error bad frame=null”。问题是,当连接关闭时,执行将使用if语句进入else分支。错误在if(cond1)-语句之前的代码中。我不是说if-else。我谈到这个问题:if(cond1(frame)){……}else{system.err.println(“\n错误:坏帧!!!:”+frame);}///我不知道它为什么输入else并在无限循环中打印“Error bad frame=null”。问题是,当连接关闭时,执行将使用if语句进入else分支。错误在if(cond1)-语句之前的代码中。