我正在使用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();
}
}
}
最后,我可以通过使用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();
}