【问题标题】:Exception in thread "main" java.net.ConnectException: Connection refused: connect Socket Programming Java线程“主”java.net.ConnectException 中的异常:连接被拒绝:连接套接字编程 Java
【发布时间】:2017-03-14 16:18:18
【问题描述】:

我最近学习了客户端和服务器之间的套接字编程。所以我想做一个连接客户端和服务器的练习。但是,当我尝试运行代码时遇到此错误消息: 线程“主”java.net.ConnectException 中的异常:连接被拒绝:连接

这是我的客户端类代码:

public class clientpart {
    public static void main(String[]args) throws UnknownHostException, IOException {
        Scanner input = new Scanner(System.in);
        int port = 8080;
        String host=null;
        String answer; String sendMessage; String receivedMessage;
        InetAddress address = InetAddress.getByName(host);
        Socket socket= new Socket(address,port);

        OutputStream os = socket.getOutputStream();
        OutputStreamWriter osw = new OutputStreamWriter(os);
        BufferedWriter bw = new BufferedWriter(osw);

        System.out.println("Please answered the following question: ");
        System.out.println("What is the subject code for Socket Programming?");
        answer = input.nextLine();

        sendMessage = answer;
        bw.write(sendMessage);
        bw.newLine();
        bw.flush();
        System.out.println("Message sent to server: "+sendMessage);

        InputStream is = socket.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        receivedMessage = br.readLine();
        System.out.println("Message received from server : " + receivedMessage);
    }
}

这是我的服务器代码:

public class serverpart {
    public static Socket socket;
    public static void main(String[]args) throws IOException {
        int port = 8080;
        String answer; String returnedMessage; String reply;
        ServerSocket server = new ServerSocket(port);
        System.out.println("Server start at port "+port+".");

        while(true)
        {
            socket = server.accept();
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            answer = br.readLine();
            System.out.println("Message sent from client: " + answer);

            if("NET 3202".equals(answer) || "net 3202".equals(answer) || "NET3202".equals(answer) || "net3202".equals(answer)){
                reply = "Correct!";
                returnedMessage = reply;
            }
            else{
                reply = "Wrong!";
                returnedMessage = reply;
            }

            OutputStream os = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);
            bw.write(returnedMessage);
            bw.newLine();
            System.out.println("Message replied to client: "+returnedMessage);
            bw.flush();
        }
    }
}

完整的错误信息是:

Exception in thread "main" java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at java.net.Socket.connect(Socket.java:538)
at java.net.Socket.<init>(Socket.java:434)
at java.net.Socket.<init>(Socket.java:244)
at clientpart.main(clientpart.java:13)
C:\Users\PeiErn\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 1 second)

希望有人能帮助我,谢谢。

【问题讨论】:

  • 我可能会在您接受连接后(在服务器上)和连接后(在客户端上)同时创建输入/输出流。我相信它正在经历,并且由于它们在不同的“线程”上运行,因此不会同时创建流。这可能导致错误?身份证?只是我的意见。
  • 感谢@nicolas 格式化海报的代码。原始海报:发布格式不正确的代码只会使您的问题更难阅读和理解——为什么要这样做?
  • 唯一的问题是你的端口号。你不能使用保留端口。只需将端口号更改为 9085 之类的就可以了
  • @MdAyubAliSarker 我试图将端口号更改为 80 以外的其他端口号,但随后客户端类向我显示此错误:线程“主”java.net.ConnectException 中的异常:连接被拒绝:连接
  • 'ConnectException: connection denied' 只是表示您在客户端中获取了错误的主机名或 IP 地址或端口,或者您在运行客户端时没有启动服务器。

标签: java sockets server client


【解决方案1】:

您的程序中有 2 个问题:

  1. 您使用的端口80well-known ports系统端口(0 到1023)的一部分,因此您需要以管理员权限启动服务器或将其更改为@例如 987654325@。
  2. 您忘记在每个bw.write(sendMessage) 之后调用bw.newLine(),这样它就会一直等待,因为在另一端您调用br.readLine() 这意味着它会等待整行,而您不发送行尾字符。

为此更改您的代码:

服务器部分:

public class serverpart {
    public static Socket socket;
    public static void main(String[]args) throws IOException {
        int port = 8080;
        ...
            BufferedWriter bw = new BufferedWriter(osw);
            bw.write(returnedMessage);
            bw.newLine();
            ...

输出:

Server start at port 8080.
Accepted
Message sent from client: net3202
Message replied to client: Correct!

客户端部分:

public class clientpart {
    public static void main(String[]args) throws IOException {
        Scanner input = new Scanner(System.in);
        int port = 8080;
        ...
        bw.write(sendMessage);
        bw.newLine();
        bw.flush();
        ...

输出:

Please answered the following question: 
What is the subject code for Socket Programming?
net3202
Message sent to server: net3202
Message received from server : Correct!

【讨论】:

  • 当我将端口更改为 8080 时,它给了我这个错误消息:线程“main”java.net.ConnectException 中的异常:连接被拒绝:连接
  • 我还检查了服务器是否正在侦听端口 8080,而不是。那是问题吗?谢谢。
  • 你在客户端和服务器上都改了吗?你在同一台机器上启动吗?是的没错,连接被拒绝意味着服务器没有在监听或者防火墙阻止了这个端口上的请求
  • 显然我必须先启动服务器哦,我的上帝,非常感谢您的帮助!
  • 是的,你总是必须先启动服务器
猜你喜欢
  • 2022-01-19
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多