我遇到以下错误:
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);
}
}
}
我有正确的导入,我只是没有粘贴它们。两个程序都尝试连接到localhost,只有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 :(得分:2)
在您的主机中,您只接受一个连接,然后服务器停止侦听。如果某些东西正在捆绑该连接,那么其他任何东西都无法连接到主机。应立即将接受的连接委托给另一个线程进行处理,以便主机可以再次循环并侦听服务器套接字。请参阅"Supporting Multiple Clients"中的Socket tutorial。
答案 1 :(得分:0)
从static
中的变量中删除Guest
声明。对于Host
也是如此(尽管如果你只有一个主机,它应该没问题。)
<强>更新强>
e.g。伪代码
create server socket
while true (or quit received) {
accept connection
spawn thread to handle communication
}
答案 2 :(得分:0)
需要更多详细信息,了解如何运行以及错误是什么(我怀疑客户端在尝试访问主机时返回网络级连接错误)但通常只使用一个端口:4444。我认为错误(未发布)是该端口正在同一台机器上该端口上通信的第一个程序使用。
此外,静态引用一次只允许各个套接字的一个实例存在于给定的JVM中。这些不能由使用这些相同(一个)静态资源的其他客户端类实现的多个线程同时使用。