[英]How to reopen a Java socket
我正在循環讀取Java Socket。
如果讀取引發異常,我想重新打開套接字。
為了測試這一點,我只是關閉套接字並捕獲異常。
問題是,當我嘗試重新打開套接字時:
serverSocket = new ServerSocket(port)
socket = serverSocket.accept()
它拋出一個異常:
java.net.BindException: The socket name is already in use
這是測試的直接問題。 但是它也可能在生產中發生。
引發異常后,如何通過打開新的套接字連接來可靠地恢復?
如果您誤會了您的意思,對不起。
如果套接字上的read()方法失敗,則不會關閉ServerSocket。
您仍然應該能夠調用serverSocket.accept()而不創建一個新的。 我認為這就是為什么您得到BindException的原因。
您需要創建一次ServerSocket,然后將任何可接受的套接字傳遞給其處理程序-通常是在其他線程中完成。
您收到的錯誤是因為您試圖在同一端口上偵聽兩次,這是不可能的。
本文可能會為您提供幫助。 這是代碼示例之一:
public void await() {
ServerSocket serverSocket = null;
int port = 8080;
try {
serverSocket = new ServerSocket(port, 1,
InetAddress.getByName("127.0.0.1"));
}
catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
// Loop waiting for a request
while (!shutdown) {
Socket socket = null;
InputStream input = null;
OutputStream output = null;
try {
socket = serverSocket.accept();
input = socket.getInputStream();
output = socket.getOutputStream();
// create Request object and parse
Request request = new Request(input);
request.parse();
// create Response object
Response response = new Response(output);
response.setRequest(request);
response.sendStaticResource();
// Close the socket
socket.close();
//check if the previous URI is a shutdown command
shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
}
catch (Exception e) {
e.printStackTrace();
continue;
}
}
}
我發現可以工作的是:
關閉ServerSocket之后無需延遲。 那是在IBM AIX機器上-也許在其他平台上的行為是不同的。
無需關閉套接字。
我還向套接字添加了超時,以從連接的另一端恢復。 這是在啟動和異常時運行的代碼:
if (serverSocket != null) serverSocket.close();
serverSocket = new ServerSocket(port);
socket = serverSocket.accept();
socket.setSoTimeout(TIMEOUT);
is = socket.getInputStream();
也感謝您提供關閉ServerSocket的提示。 那使我走上了正軌。 並提供有用的網絡編程參考。
在連接會話期間引發異常時,應該關閉套接字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.