1

我遇到了以下错误:

java.net.ConnectException: Connection refused: connect

我将在下面展示一些代码,但首先是一个描述,因为它让我感到困惑。我编写了一个非常基本的聊天程序,它可以充当服务器或客户端,具体取决于您按下的初始按钮(主机或连接)。与朋友一起在本地主机和互​​联网上进行了测试,按预期完美运行。我已经开始编写第二个软件并使用几乎相同的代码,但是有更多类,当我尝试连接到同一程序的主机时出现此错误。所以,prog A 可以很好地连接到 prog A,但 B 不能连接到 B。人们可能会认为防火墙存在问题,但这里的情节扭曲:B 可以连接到 A,A 可以再次完美地连接到 B。但是 B 无法连接到自身的另一个副本。我使用 TCP 的官方 oracle 教程并在称为 A 的聊天程序上完美运行。根据按钮的按下,A 将运行其主要类的方法之一(以启动服务器或客户端)。B 另一方面,将创建一个类的新对象,或者是 Host

public class Host
{
static ServerSocket serverSocket = null;
static Socket clientSocket = null;
static PrintWriter out = null;
static BufferedReader in = null;
static String inputLine;
public Host() throws IOException
    {
    serverSocket = new ServerSocket(4444);
    System.out.println("Server created, waiting for guest.");
    clientSocket = serverSocket.accept();
    System.out.println("Guest connected.");
    out = new PrintWriter(clientSocket.getOutputStream(), true);
    in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    while ((inputLine = in.readLine()) != null)
        {
        //if (inputLine.equals("q")) {break;}
        System.out.println("Message recieved:" + inputLine);
        }
    }
}

或客人

public class Guest
{
static Socket socket = null;
static PrintWriter out;
static BufferedReader in = null;
static String inputLine;
public Guest() throws IOException
    {
    System.out.println("Connecting to host");
    try
        {socket = new Socket("localhost", 4444);
         out = new PrintWriter(socket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        }
    catch (UnknownHostException err) {System.out.println("unknown host"); System.exit(3);}
    catch (IOException err) {System.out.println(err); /*System.exit(4);*/}
    System.out.println("Connected to host");

    while ((inputLine = in.readLine()) != null)
        {
        //if (inputLine.equals("q")) {break;}
        System.out.println("Message recieved:" + inputLine);
        }
    }
}

我有正确的导入,我只是没有将它们粘贴到这里。两个程序都尝试连接到本地主机,只有 A 可以工作,而另一个不能。同样,创建一个访客,我可以连接到聊天程序的服务器。聊天程序客户端可以连接到此服务器。但是这个客户端无法连接到这个服务器。

有没有人经历过类似的事情?有没有明显的解决方案,我错过了什么?我在这里真的一无所知,我从字面上复制/粘贴了服务器/客户端代码。

编辑:堆栈跟踪。

java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:69)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at mainPack.Guest.<init>(Guest.java:21)
at mainPack.GameStarter.grandMain(GameStarter.java:101)
at mainPack.GameStarter.<init>(GameStarter.java:27)
at mainPack.GameStarter.main(GameStarter.java:34)
4

3 回答 3

2

在您的主机中,您只接受一个连接,然后服务器停止侦听。如果有什么东西阻碍了这个连接,那么其他任何东西都无法连接到主机。接受的连接应立即委托给另一个线程进行处理,以便主机可以循环并再次侦听服务器套接字。请参阅Socket 教程中的“支持多个客户端”

于 2013-02-25T01:45:27.477 回答
0

从. static_ Guest相同Host(尽管如果您只有一个主机,应该没问题)。

更新

例如伪代码

create server socket
while true (or quit received) {
    accept connection
    spawn thread to handle communication
}
于 2013-02-25T01:20:46.440 回答
0

需要更多关于它是如何运行的以及错误到底是什么的详细信息(我怀疑客户端在尝试访问主机时会返回一个网络级连接错误),但通常只使用一个端口:4444。我认为错误(未发布)是该端口正在被同一台机器上在该端口上通信的第一个程序使用。

此外,静态引用一次只允许各种套接字的一个实例存在于给定的 JVM 中。这些不能被多个线程同时使用,这些线程可能由使用这些相同(一个)静态资源的其他客户端类实现。

于 2013-02-25T01:29:10.843 回答