![](/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.