Java 套接字客户端断开连接时的无限循环
我已经实现了一个Java多线程套接字服务器。它工作正常,为每个新的客户端连接创建一个新线程。但是我有一个错误,当客户端切断TCP连接时,服务器进入一个无限循环,每个循环我都会收到以下消息: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
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)-语句之前的代码中。