繁体   English   中英

从客户端将数据传递到服务器后,由于 Java Socket 中的 parseInt 导致“连接被拒绝:连接”错误?

[英]Getting a 'Connection refused: connect' error because parseInt in Java Socket after passing data to the server from client?

我试图从客户端向服务器传递一个Integer因此在 Server 类中,我可以使用该整数作为斐波那契函数的参数。 问题是程序运行得非常好,并且在添加以下几行之前连接已经很好:

String transformedData = data.toString();
int transformedInt = Integer.parseInt(transformedData);
                
int result = fibonacci(transformedInt); 

因此,当我将任何字符串从客户端传递到服务器时,我不知道为什么会出现错误(如下)

java.net.ConnectException: Connection refused: connect
    at java.base/sun.nio.ch.Net.connect0(Native Method)
    at java.base/sun.nio.ch.Net.connect(Net.java:503)
    at java.base/sun.nio.ch.Net.connect(Net.java:492)
    at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:588)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:333)
    at java.base/java.net.Socket.connect(Socket.java:648)
    at java.base/java.net.Socket.connect(Socket.java:597)
    at java.base/java.net.Socket.<init>(Socket.java:520)
    at java.base/java.net.Socket.<init>(Socket.java:294)
    at ajHomeWork1/cop2805.Client.main(Client.java:14)

另外,我是 Java 套接字编程的新手,所以我真的不知道将字节数据转换为 Integer 的操作是否是该程序的正确方法

服务器类:

public class Server {
        
    static int fibonacci(int numb) // Recursive Fibonacci
    {
        if (numb <= 1)
            return numb;
        return fibonacci(numb-1) + fibonacci(numb-2);
    }
         
        
    
    public static void main(String[] args) {
        
        
        ServerSocket server = null;
        boolean shutdown = false;
        
        
        try {
            server = new ServerSocket(1238);
            System.out.println("Port bound. Accepting Conncetions");
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }
        
        while(!shutdown) {
            Socket client = null;
            InputStream input = null;
            OutputStream output = null;
            
            try {
                client = server.accept();
                input = client.getInputStream();
                output = client.getOutputStream();
                
                int n = input.read();
                byte[] data = new byte[n];
                String transformedData = data.toString();
                int transformedInt = Integer.parseInt(transformedData);
                
                int result = fibonacci(transformedInt); 
                input.read(data);
                
                String clientInput = new String(data, StandardCharsets.UTF_8);
                clientInput.replace("\n", "");
                System.out.println("Client said " + clientInput);
                
                String response = "Your input was [" + clientInput + "]" + " Fibonacci result of " + transformedInt + " is : " + result;
                output.write(response.length());
                output.write(response.getBytes());
                
                client.close();
                if(clientInput.equalsIgnoreCase("shutdown")) {
                    System.out.println("Shutting down....");
                    shutdown = true;
                }
            }
            
            catch (IOException e) { 
                e.printStackTrace();
                continue;
                
            }
        }

    }
}

这是客户端类:

public class Client {
    
    public static void main(String[] args) {
        System.out.print("Input an int : ");
        BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
        try {
            String userString = userInput.readLine();
            Socket connection = new Socket("127.0.0.1",1238);
            InputStream input = connection.getInputStream();
            OutputStream output = connection.getOutputStream();
            
            output.write(userString.length());
            output.write(userString.getBytes());
            
            int n = input.read();
            byte[] data = new byte[n];
            input.read(data);
            
            String serverResponse = new String(data, StandardCharsets.UTF_8);
            System.out.println("Server said: " + serverResponse);
            
            if(!connection.isClosed())
                connection.close();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端和服务器处理数据的方式存在几个逻辑错误。 但是在建立连接后对数据的错误处理不会导致“连接被拒绝”错误。 该错误意味着客户端中的new Socket("127.0.0.1",1238)语句在交换任何数据之前失败。 这意味着客户端根本无法连接到服务器,要么是因为:

  • IP/端口错误,或没有服务器侦听该 IP/端口。
  • 服务器的待处理连接积压已满。
  • 防火墙/防病毒软件正在阻止连接。

一旦您解决了该问题并可以正确建立连接,请尝试更类似于以下有关数据交换的操作:

服务器类:

public class Server {

    static int fibonacci(int numb) // Recursive Fibonacci
    {
        if (numb <= 1)
            return numb;
        return fibonacci(numb-1) + fibonacci(numb-2);
    }

    public static void main(String[] args) {    

        ServerSocket server = null;
        boolean shutdown = false;   

        try {
            server = new ServerSocket(1238);
            System.out.println("Port bound. Accepting Conncetions");
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }

        while (!shutdown) {
            try {
                Socket client = server.accept();
                DataInputStream input = new DataInputStream(new BufferedInputStream(client.getInputStream()));
                DataOutputStream output = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));

                int n = input.readInt();
                byte[] data = new byte[n];
                input.readFully(data);

                String clientInput = new String(data, StandardCharsets.UTF_8);
                clientInput.replace("\n", "");

                System.out.println("Client said " + clientInput);
                String response;

                if (clientInput.equalsIgnoreCase("shutdown"))
                {
                    System.out.println("Shutting down....");
                    response = "Shutting down";
                    shutdown = true;
                }
                else
                {
                    int transformedInt = Integer.parseInt(clientInput);
                    int result = fibonacci(transformedInt); 
                    response = "Your input was [" + clientInput + "] Fibonacci result of " + Integer.toString(transformedInt) + " is : " + Integer.toString(result);
                }

                data = response.getBytes(StandardCharsets.UTF_8);
                output.writeInt(data.length());
                output.write(data, 0, data.length());
                output.flush();

                client.close();
            }
            catch (IOException e) { 
                e.printStackTrace();
            }
        }
    }
}

客户端类:

public class Client {
    
    public static void main(String[] args) {
        System.out.print("Input an int : ");
        BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
        try {
            String userString = userInput.readLine();

            Socket connection = new Socket("127.0.0.1", 1238);
            DataInputStream input = new DataInputStream(new BufferedInputStream(connection.getInputStream()));
            DataOutputStream output = new DataOutputStream(new BufferedOutputStream(connection.getOutputStream()));
            
            bytes[] data = userString.getBytes(StandardCharsets.UTF_8);
            output.writeInt(data.length());
            output.write(data, 0, data.length());
            output.flush();
            
            int n = input.readInt();
            data = new byte[n];
            input.readFully(data);
            
            String serverResponse = new String(data, StandardCharsets.UTF_8);
            System.out.println("Server said: " + serverResponse);
            
            connection.close();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM