为啥我收到“地址已在使用(绑定失败)”? [复制]

Posted

技术标签:

【中文标题】为啥我收到“地址已在使用(绑定失败)”? [复制]【英文标题】:Why am I getting “Address already in use (Bind failed)”? [duplicate]为什么我收到“地址已在使用(绑定失败)”? [复制] 【发布时间】:2017-11-27 08:57:21 【问题描述】:

这应该很简单,但我在这里遗漏了一些东西。我有两个玩具类:(a)期望连接并提供文件的服务器; (b) 请求文件并将其打印到标准输出的客户端。

服务器代码:

package lp2.tarefa4;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import static java.lang.String.format;
import java.net.ServerSocket;
import java.net.Socket;

public class ServidorWeb implements Runnable 

    private final String dirName;

    public ServidorWeb(String dirName) 
        this.dirName = dirName;
    

    public static void main(String[] args) 
        ServidorWeb srv = new ServidorWeb(args[0]);
        srv.run();
    

    @Override
    public void run() 
        System.out.println("Server started. Waiting for connections...");

        while (true) 
            try 
                ServerSocket server = new ServerSocket(48080);
                Socket socket = server.accept();
                proccessRequest(socket);
            
            catch (IOException ex) 
                System.err.println("!!! ERRO: " + ex.getMessage());
            
        
    

    private void proccessRequest(Socket socket) throws IOException 
        DataInputStream in = new DataInputStream(socket.getInputStream());
        DataOutputStream out = new DataOutputStream(socket.getOutputStream());
        String fileName = in.readUTF();
        File inputFile = new File(dirName, fileName);

        String msg = format("Request: %s:%d [%s]", 
                socket.getInetAddress(), 
                socket.getPort(), 
                inputFile.getPath());
        System.out.println(msg);

        DataInputStream fin = new DataInputStream(new FileInputStream(inputFile));
        String s = fin.readUTF();
        while (s != null) 
            out.writeUTF(s);
            s = fin.readUTF();
        
        in.close();
        out.close();
        fin.close();
    


客户端代码:

package lp2.tarefa4;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class ClienteWeb implements Runnable 

    private final String host;
    private final int port;
    private final String fileName;

    public ClienteWeb(String host, int port, String fileName) 
        this.host = host;
        this.port = port;
        this.fileName = fileName;
    

    public static void main(String[] args) 
        ClienteWeb srv = new ClienteWeb(args[0], Integer.parseInt(args[1]), args[2]);
        srv.run();
    

    @Override
    public void run() 
        try 
            Socket socket = new Socket(host, port);
            DataInputStream in = new DataInputStream(socket.getInputStream());
            DataOutputStream out = new DataOutputStream(socket.getOutputStream());
            out.writeUTF(fileName);
            String s = in.readUTF();
            while (s != null) 
                System.out.println(s);
                s = in.readUTF();
            
            in.close();
            out.close();
            socket.close();
        
        catch (IOException ex) 
            System.err.println("!!! ERRO: " + ex.getMessage());
        
    


我试图在同一台机器上同时运行服务器和客户端,但每次我尝试运行客户端时总是从服务器收到此消息:

!!!错误:地址已在使用中(绑定 失败)

我是否必须执行与上述不同的操作才能无错误地运行此代码?

谢谢。

【问题讨论】:

在你的代码中,你也应该关闭 ServerSocket 【参考方案1】:

该错误通常意味着您尝试打开的端口已被另一个应用程序使用尝试使用 netstat 查看哪些端口已打开,然后使用可用端口。

还要检查您是否绑定到正确的 IP 地址(我假设它是 localhost)

netstat -tulpn 将使人们能够找到正在使用特定端口的进程 ID。

【讨论】:

以上是关于为啥我收到“地址已在使用(绑定失败)”? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将值插入表后,我收到错误消息 1136,为啥? [复制]

为啥我在 Mysql SELECT 查询期间收到此 UnicodeDecodeError? [复制]

为啥我在尝试使用 HttpListener 时会收到“AccessDenied”? [复制]

为啥我在运行动态 Web 项目时收到 HTTP 404 错误? [复制]

为啥我在不使用 get 方法时不断收到“The GET method...”? [复制]

为啥我收到 PHP 致命错误:未捕获的错误:找不到类“MyClass”? [复制]