![](/img/trans.png)
[英]Keep getting annoying warning “bind failed: EADDRINUSE (Address already in use)”
[英]TCP Socket IOExceptionbind failed: EADDRINUSE (Address already in use)
在看到有關此錯誤的幾篇文章后,我真的不明白為什么有時我會收到此異常
我在這里看到了幾條建議對綁定套接字進行循環的文章,但我認為它應該執行一次,而在其他地方存在問題。
這是我的代碼:
public ServerNetworkThread()
{
setName("ServerNetworkThread");
_port = Logics.getInstance().getSharedPrefsManager().getInt(SharedPreferencesManager.SERVER_PORT_KEY, Consts.SERVER_PORT);
}
public void setHandler(Handler h)
{
_handler = h;
}
@Override
public void run()
{
_isWorking = true;
try
{
_serverSocket = new ServerSocket();
_serverSocket.setReuseAddress(true);
_serverSocket.bind(new InetSocketAddress(_port));
while (_isWorking)
{
_socket = _serverSocket.accept();
_socket.setSoTimeout(Consts.CLIENT_SOCKET_TIMEOUT);
readDataTest();
}
}
catch (SocketTimeoutException e)
{
e.printStackTrace();
Logger.d("anton", e.getMessage());
}
catch (IOException e)
{
e.printStackTrace();
Logger.d("anton", "server thread IOException" + e.getMessage());
}
}
private void readDataTest() throws IOException
{
// BufferedReader inFromClient = new BufferedReader(new InputStreamReader(_socket.getInputStream(),Charset.forName("UTF-16LE")));
// BufferedReader inFromClient = new BufferedReader(new InputStreamReader(_socket.getInputStream(),Charset.forName("UTF-16LE")));
InputStream iStream = _socket.getInputStream();
InputStreamReader in = new InputStreamReader(iStream, Charset.forName("UTF-16LE"));
DataOutputStream outToClient = new DataOutputStream(_socket.getOutputStream());
char[] buf = new char[1024];
int lettersCount = in.read(buf, 0, buf.length);
String request = new String(buf,0,lettersCount);
// request = request.split(Consts.EOF)[0];
Log.d("test","server got request="+request);
String responseStr = parseResponse(request);
byte[] response = responseStr.getBytes("UTF-16LE");
outToClient.write(response);
outToClient.flush();
outToClient.close();
in.close();
_socket.close();
}
這是我的例外:
W/System.err( 1433): java.net.BindException: bind failed: EADDRINUSE (Address already in use)
W/System.err( 1433): at libcore.io.IoBridge.bind(IoBridge.java:89)
W/System.err( 1433): at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:150)
W/System.err( 1433): at java.net.ServerSocket.bind(ServerSocket.java:319)
W/System.err( 1433): at java.net.ServerSocket.bind(ServerSocket.java:282)
W/System.err( 1433): at com.example.visionixpanel.logics.network.ServerNetworkThread.run(ServerNetworkThread.java:61)
W/System.err( 1433): Caused by: libcore.io.ErrnoException: bind failed: EADDRINUSE (Address already in use)
W/System.err( 1433): at libcore.io.Posix.bind(Native Method)
W/System.err( 1433): at libcore.io.ForwardingOs.bind(ForwardingOs.java:40)
W/System.err( 1433): at libcore.io.IoBridge.bind(IoBridge.java:87)
W/System.err( 1433): ... 4 more
它由以下行拋出:
_serverSocket.bind(new InetSocketAddress(_port));
更新:
我也有這段代碼:
public void stopThread()
{
_isWorking = false;
try
{
if (_serverSocket != null)
{
_serverSocket.close();
}
if (_socket != null)
{
_socket.close();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
也許與清理線程套接字資源有關?
我不太明白為什么有時候我會收到這個例外
您要綁定的端口已被使用。
我在這里看到了幾條建議對綁定套接字進行循環的文章,但我認為它應該執行一次,而在其他地方存在問題。
我同意。 問題是其他進程已經在使用該端口。 例如,可能是您的應用程序的事先調用。 確保它已經退出。 如果不是那樣,您將必須找到它是什么進程並采取適當的補救措施,或者使用其他端口號。
我看到您已經在使用setReuseAddress(true)
來解決此問題的最常見情況。
也許與清理線程套接字資源有關?
沒有。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.