2013-02-25 73 views
1

我也遇到过下面的错误连接错误:一个奇怪的连接被拒绝:在Java客户端

java.net.ConnectException: Connection refused: connect 

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

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有效,而另一个则不行。再次,创建一个Guest,我可以连接到chatprogram的服务器。聊天程序客户端可以连接到此服务器。但是这个客户端不能连接到这个服务器。

有没有人遇到类似的东西?有没有一个明显的解决方案,我失踪了?我在这里真的很无能,我直接复制/粘贴服务器/客户端代码。

编辑:堆栈跟踪。

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) 
+0

我不明白。“聊天程序客户端可以连接到此服务器”和“但该客户端无法连接到此服务器”有什么区别? – EJP 2013-02-25 02:20:21

+0

两个不同的程序,这些程序的目的是能够充当服务器或客户端的另一个实例。程序A可以连接到程序A的另一个实例.B不能连接到另一个B. B可以连接到A,而A可以连接到B,但从来不打算以这种方式使用,但它们可以建立连接。 – 1024 2013-02-25 02:23:19

回答

0

Guest中的变量中删除您的static声明。 Host相同(但如果你只有一个主机,它应该没问题)。

更新

例如伪代码

create server socket 
while true (or quit received) { 
    accept connection 
    spawn thread to handle communication 
} 
+0

这样做,没有改变。 – 1024 2013-02-25 01:22:31

+0

好的。那么它肯定不会用'static'。东西会混在一起真的很糟糕。 – xagyg 2013-02-25 01:23:10

+1

您应该生成一个线程来处理通信,并让主机通过accept()连接另一个客户端。接受应该在一个循环中。 – xagyg 2013-02-25 01:25:38

0

需要更多的细节,这是如何正在运行,哪些错误是完全(我怀疑客户端返回的网络级试图到达主机时,连接错误),但一般只存在一个端口被使用:4444.我认为这个错误(没有发布)是这个端口正被在同一台机器上的那个端口上通信的第一个程序使用。

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

+0

那么,我不知道如何从这个错误中获得更多的附加信息,但我可以说我尝试了以前未使用过的不同端口,但没有成功。添加静态聊天程序没有改变,它仍然正常工作。删除每一个静态修改器也没有改变第二个程序。 – 1024 2013-02-25 01:34:28

+0

看,显示一个新的线程在互联网上的各种网络的例子被称为和或与“接受()”来管理新的客户端连接线程正在创建一个新的服务器套接字资源。这是一个基本的单一资源问题。 – 2013-02-25 20:40:37

2

在您的主机中,您只接受一个连接,然后服务器停止监听。如果有什么东西在捆绑连接,则没有其他东西能够连接到主机。应立即将接受的连接委托给另一个线程进行处理,以便主机可以循环并再次侦听服务器套接字。请参阅Socket tutorial中的"Supporting Multiple Clients"

+0

这个主机应该只接受一个连接。它从不接受一个,只有当我连接聊天程序时,如前所述,它可以完美地与几乎相同的代码一起工作。 – 1024 2013-02-25 01:51:06

+0

它可能有助于显示异常的完整堆栈跟踪。 – 2013-02-25 01:57:18

+0

用此编辑。 – 1024 2013-02-25 02:06:45