【问题标题】:java.net.ConnectException: Connection refused: connect occuredjava.net.ConnectException:连接被拒绝:连接发生
【发布时间】:2017-05-14 08:51:38
【问题描述】:

我正在尝试在 Windows 命令行中运行代码并收到异常:

D:\dasi\java\javaLab>java ServerClient
java.net.ConnectException: Connection refused: connect
java.lang.StringIndexOutOfBoundsException: String index out of range: -2

D:\dasi\java\javaLab>

在另一个命令行windw:

D:\dasi\java\javaLab>java SocketClient
java.net.ConnectException: Connection timed out: connect

D:\dasi\java\javaLab>

服务器代码:

import java.io.*;
import java.net.*;
public class ServerClient {
    public ServerClient(int port) {
        Server server = new Server(port);
        server.start();
        Client client = new Client(port);
        client.start();
    }
    public static void main(String[] args) {
        ServerClient s1 = new ServerClient(7777);
    }
}

class Server extends Thread {
    int port;
    ServerSocket server;
    Socket socket;
    DataOutputStream outStream = null;
    DataInputStream inStream = null;
    public Server(int poort) {
        try {
            this.port = port;
            server = new ServerSocket(port);
        }
        catch(Exception e) {
            System.out.println(e.toString());
        }
    }
    public void run() {
        try {
            socket = server.accept();
            outStream = new DataOutputStream(socket.getOutputStream());
            inStream = new DataInputStream(socket.getInputStream());
            System.out.println("server is ok, please continue!");
            while(true) {
                String str = inStream.readUTF();
                System.out.println("The server receive String:"+str);
                outStream.writeUTF(str);
            }
        }
        catch(Exception e) {
            System.out.println(e.toString());
        }
    }
}

class Client extends Thread {
    int port;
    Socket socket;
    DataInputStream inStream = null;
    DataOutputStream outStream = null;
    public Client(int port) {
        try {
            this.port = port;
            socket = new Socket(InetAddress.getLocalHost(),port);
            inStream = new DataInputStream(socket.getInputStream());
            outStream = new DataOutputStream(socket.getOutputStream());
            System.out.println("client is ok, please continue!");
        }
        catch(Exception e) {
            System.out.println(e.toString());
        }
    }
    public void run() {
        try {
            while(true) {
                byte[] b = new byte[1024];
                String str = "";
                int m = System.in.read(b);
                str = new String(b,0,0,m-1);
                outStream.writeUTF(str);
                str = inStream.readUTF();
                System.out.println("The client receive String:"+str);
            }
        }
        catch(Exception e) {
            System.out.println(e.toString());
        }
    }
}

客户端代码:

import java.net.*;
import java.io.*;
public class SocketClient {
    Socket s = null;
    DataInputStream inStream = null;
    DataOutputStream outStream = null;
    public SocketClient() {
        try {
            init();
            waitData();
        }
        catch(Exception e) {
            System.out.println(e.toString());
        }
    }
    void init() throws Exception {
        s=new Socket("10.15.43.216",8765);
        inStream = new DataInputStream(s.getInputStream());
        outStream = new DataOutputStream(s.getOutputStream());
        s.setSoTimeout(3000);
    }
    void waitData() {
        while(true) {
            try {
                String str = inStream.readUTF();
                System.out.println("Client accept:" +str);
                str = Integer.toString(Integer.parseInt(str)+1);
                outStream.writeUTF(str);
            }
            catch(Exception e) {
                System.out.println(e.toString());
                break;
            }
        }
    }
    public static void main(String[] args) {
        new SocketClient();
    }
}

我想知道我的代码是否有任何问题,或者是我的计算机端口导致了问题。因为当我检查我的计算机端口时,我没有看到 7777。当我发出命令 netstat -nao | findstr 7777,它什么也没返回。

D:\dasi\java\javaLab>netstat -nao | findstr 7777

D:\dasi\java\javaLab>

如果是端口问题,那么如何打开7777端口。 我是这里的新手,请帮助。非常感谢!

【问题讨论】:

    标签: java exception tcp connection


    【解决方案1】:

    替换

     public Server(int poort) {
        try {
            this.port = port;
            ...
        }
    }
    

     public Server(int poort) {
        try {
            this.port = port;
            ...
        }
    }
    

    或者说端口的默认值是零,那么你的 serverSocket 将绑定 0 端口而不是 7777。

    至于这段代码:

    public ServerClient(int port) {
        Server server = new Server(port);
        server.start();
        Client client = new Client(port);
        client.start();
    }
    

    恐怕很容易给你添麻烦,因为我们不能保证服务器线程会在客户端线程之前执行,如果客户端线程 strong>服务器没有运行时先执行,会报错。而且你已经在另一个java文件中有一个客户端,所以我不明白你为什么在这里有一个客户端。也许你可以删除它们,代码可以是这样的:

    public ServerClient(int port) {
        Server server = new Server(port);
        server.start();
    }
    

    至于客户端代码 您的服务器套接字是 7777,因此您应该在 init 方法中连接 7777 端口而不是 8765,也许代码可以是这样的:

    void init() throws Exception {
        s=new Socket(server name,7777);
        ...
    }
    

    【讨论】:

    • 谢谢,更改服务器代码中的错误后,我现在可以运行它了。但是对于客户端,我仍然会收到连接超时异常。
    • 将端口号8765改为7777后,仍然收到连接超时异常。
    • @Lily 在 init 方法 中评论 s.setSoTimeout(3000);。或者更确切地说,对与此 Socket 关联的 InputStream 的 read() 调用只会阻塞 3000 毫秒。如果超时到期,则会引发 java.net.SocketTimeoutException
    • 谢谢,我评论了这一行,但仍然是同样的超时异常。不知道哪里错了。
    • @Lily 尝试将“10.15.43.216”替换为“127.0.0.1”。不知道“10.15.43.216”是不是你的serverSocket地址。
    猜你喜欢
    • 2017-08-10
    • 2023-03-21
    • 2015-05-18
    • 2018-06-10
    • 2014-05-17
    • 2013-11-05
    • 2015-09-09
    • 1970-01-01
    相关资源
    最近更新 更多