无法连接 Java 套接字

Posted

技术标签:

【中文标题】无法连接 Java 套接字【英文标题】:Can't connect Java sockets 【发布时间】:2021-10-28 04:09:35 【问题描述】:

我正在尝试连接两个简单的 Java 套接字,但无论我输入什么端口号,我都会收到相同的错误:地址已在使用中:JVM_Bind

现在我发现我通过使用 0 作为 ServerSocket 构造函数的参数,然后调用 getLocalPort 方法来获取第一个可用端口,然后将其作为参数传递给 Socket 构造函数中的客户端类,从而解决了这个问题。

所以,在 NetBeans IDE 中,我首先运行服务器,从控制台获取可用端口,复制数字并手动将其作为“localhost”之后的第二个参数输入到 Socket 构造函数并运行客户端。

现在预期的输出将是“已连接”,因为服务器已接受客户端,但相反,我得到的可用端口号增加了 1。

为什么会这样?似乎当我在 client.java 文件中单击运行时,我再次启动服务器而不是客户端。

服务器.java

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class server 

    public static void main(String[] args) throws IOException 

        ServerSocket s1 = new ServerSocket(58801);/I manually add the available port number here 

        System.out.println(s1.getLocalPort());

        Socket ss = s1.accept();

        System.out.println("Client connected");

    


client.java:

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


public class client 

    public static void main(String[] args) throws IOException 

        Socket s = new Socket("localhost", 58801); // I here manually add the available port number 

    


【问题讨论】:

你使用0,作为ServerSocket(0);中的一个端口,这个端口是保留的,你不能用。 @GiorgiTsiklauri 哦,我只是错误地将其保留为 0,我也确实在那里传递了可用端口号,但我总是得到同样的错误:地址已在使用中:JVM_Bind 这很好用。我无法重现该问题。最有可能的是,您使用该端口.. 通过netstat 检查。 您的代码在我的机器上运行良好,只要我在客户端之前运行服务器。 @GonenI 你是对的。通过按下 NetBeans 中的运行按钮,我实际上是在再次运行同一个文件。我只是右键单击客户端,选择运行,我得到了想要的结果。谢谢。 【参考方案1】:

在 OP 已经弄清楚之后,一个有点迟的答案:

一个可能的原因是在 IDE 中错误地运行了服务器两次。第一次运行抓取端口,第二次运行服务器会发现该端口已被使用并产生错误。

【讨论】:

【参考方案2】:

Server 客户端套接字示例:

服务器类:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class GreetServer 
    private ServerSocket serverSocket;
    private Socket clientSocket;
    private PrintWriter out;
    private BufferedReader in;

    public void start(int port) throws IOException 
        serverSocket = new ServerSocket(port);
        clientSocket = serverSocket.accept();
        out = new PrintWriter(clientSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        String greeting = in.readLine();
        if ("hello server".equals(greeting)) 
            out.println("hello client");
         else 
            out.println("unrecognised greeting");
        
    

    public void stop() throws IOException 
        in.close();
        out.close();
        clientSocket.close();
        serverSocket.close();
    

    public static void main(String[] args) throws IOException 
        GreetServer server = new GreetServer();
        server.start(6666);
    

客户端类:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class GreetClient 
    private Socket clientSocket;
    private PrintWriter out;
    private BufferedReader in;

    public void startConnection(String ip, int port) throws IOException 
        clientSocket = new Socket(ip, port);
        out = new PrintWriter(clientSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    

    public String sendMessage(String msg) throws IOException 
        out.println(msg);
        String resp = in.readLine();
        return resp;
    

    public void stopConnection() throws IOException 
        in.close();
        out.close();
        clientSocket.close();
    

    public static void main(String[] args) throws IOException 
        GreetClient client = new GreetClient();
        client.startConnection("127.0.0.1", 6666);

        String response = client.sendMessage("hello server");
        System.out.println("Response from server: " + response);
    

示例响应:

Response from server: hello client

【讨论】:

这里没有回答 OP 的问题“为什么会发生这种情况?”

以上是关于无法连接 Java 套接字的主要内容,如果未能解决你的问题,请参考以下文章

高分求解,急!!!Java连接Oracle10g 问题 java.sql.SQLException: 无法从套接字读取更多的数据

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接 异常解决方法

详解:驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server 建立安全连接。

java:驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接:“The server selected protocol version TLS10 is not a

虚拟机VMware无法打开,提示无法连接MKS:套接字连接次数太多,正在放弃