How to close port after using server sockets [closed]
In my application I create a ServerSocket
instance with some port. After I am finished, I close the socket, but when I try to make a new ServerSocket
on the same port, it throws:
"java.net.BindException: Address already in use"
If I create the ServerSocket
with a different port, then it works.
ServerSocket.isClosed
also returns true
What is the problem?
public void run() {
try {
BufferedInputStream bufferedinputstream = new BufferedInputStream(
new FileInputStream(fileReq));
BufferedOutputStream outStream = new BufferedOutputStream(
cs.getOutputStream());
byte buffer[] = new byte[1024];
int read;
System.out.println(cs);
while ((read = bufferedinputstream.read(buffer)) != -1)
{
outStream.write(buffer, 0, read);
outStream.flush();
}
System.out.println("File transfered");
outStream.close();
bufferedinputstream.close();
try {
this.finalize();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (Exception e) {
Sys开发者_高级运维tem.out.println("Exce....");
System.out.println(e.getMessage());
}
finally
{
if ( cs != null)
try {
int usedPort=cs.getLocalPort();
System.out.println("Closing "+cs);
cs.close();
System.out.println(cs+" Closed");
System.out.println("asd"+cs.isClosed());
portManager.getInstance().mp.put(usedPort,true);
} catch (IOException e) {
System.err.println("in sendToClient can't close sockt");
System.err.println(e.getMessage());
}
}
Have you tried calling setReuseAddress(true)
on the server socket? It's normal for the TCP state machine to enter TIME_WAIT
state. For detailed explanation look here.
It is because there is a cooldown period implemented on some O.S. If you wait a little (a couple of minutes for example), then you should be able to access the port again.
That being said, it is not a good idea to open and close serversockets on a port. It is better to open it and keep it open as long as necessary. Then close it when you are done. Don't open/close/open/close/open/close...
Just close the socket when done. It automatically shuts down the port it is listening on. Never keep open the socket (port) when you are done.
This means that the server is already open you need a check for user input or client input that says close the server like
while( bufferedinputstream != "quit" )
try{
...
}
Once you have the server open its just open until something closes it.
精彩评论