我正在使用Java套接字将数据从客户端传输到我的服务器,用户必须单击按钮以打开与特定端口的连接,客户端必须运行可执行jar文件才能将数据发送到打开的端口,但是在某些情况下,由于某些原因,用户单击按钮,然后关闭浏览器选项卡! 当他尝试再次单击该按钮时,它会显示
已经在使用的地址:JVM_Bind
有什么办法解决这个问题?!
是否有可能在使用端口之前将其杀死?
我的服务器端类代码,以防万一有人需要检查:
class Server {
private Socket socket = null;
private ServerSocket server = null;
private DataInputStream in = null;
public Server(Integer port) throws Exception {
try {
server = new ServerSocket(port);
JSFUtils.addFacesInformationMessage("Waiting for a Data...");
socket = server.accept();
JSFUtils.addFacesInformationMessage("Done");
in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
String line = in.readUTF();
System.out.println("Data Scaned >> " + line);
} catch (Exception i) {
i.printStackTrace();
} finally {
// close connection
if (socket != null)
socket.close();
if (in != null)
in.close();
}
}
}
答案 0 :(得分:1)
最后,我可以通过使用server.setSoTimeout(10 * 1000);
来解决此问题,您可以使用所需的毫秒数来设置超时时间。在指定的时间用完客户端客户端后,它将引发“ SocketTimeoutException”并且用户可以再次再次单击服务器端的按钮,则可以通过类似
try {
server = new ServerSocket(port);
server.setSoTimeout(10 * 1000);
socket = server.accept();
JSFUtils.addFacesInformationMessage("Scan Completed Successfully");
// takes input from the client socket
in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
String line = in.readUTF();
} catch (Exception i) {
if (i instanceof SocketTimeoutException)
JSFUtils.addFacesErrorMessage("Scan Timeout, Please click Scan again!");
else
i.printStackTrace();
}