套接字关闭异常发生在无限循环中

时间:2016-12-18 10:44:52

标签: java sockets server-side

我应该编写一个程序,将一些.class文件作为服务,并且应该加载它们并执行服务。我已经使用套接字编程完成了它,但由于我已经使它成为多线程,所以服务可以被任意数量的客户端使用,我得到套接字关闭异常,它发生在每个客户端线程完成后的无限循环中。即使有一个客户端我仍然得到这个例外。我没有得到异常的唯一一次是没有加载的类我使用break。我试图找到问题并搜索了很多,但我找不到任何东西。 //这是服务器端的主要类

    package reg.main;
    import java.net.*;
    import java.io.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import java.util.*;
    import java.util.concurrent.*;

    public class Application{
        private final static Logger LOGGER = LoggerFactory.getLogger(Application.class);

        public static void main(String[] args){
             while(true){
                InputStream input = null;
                Properties prop = new Properties();

                try{
                String filename = "config.properties";
                input = Application.class.getClassLoader().getResourceAsStream(filename);
                if(input == null){
                    System.out.println("Sorry, unable to find " + filename);
                }
                prop.load(input);
                }
                catch(IOException ex){
                    System.out.println("properties file does not exist.");
                }
                try{
                    String port = prop.getProperty("port");
                    int portNo = Integer.parseInt(port);
                    ServerSocket serverSocket = new ServerSocket(portNo);
                    LOGGER.debug("Server is listening... on port "  + portNo);

                    ExecutorService service = Executors.newFixedThreadPool(1);
                    service.execute(new Server(serverSocket.accept()));

                    serverSocket.close();
                    service.shutdown();

                }catch (IOException e) {
                    System.out.println("Could not close socket");
                    System.exit(1);
                }

            }

        }

    }

// this is server side code

    package reg.main;
    import java.net.*;
    import java.io.*;
    import reg.entity.*;
    import reg.utility.*;
    import reg.service.*;
    import reg.dao.*;
    import java.util.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

    public class Server implements Runnable{
        private static final Logger LOGGER = LoggerFactory.getLogger(Server.class);
        private Socket clientSocket;

        public Server(Socket clientSocket){
            LOGGER.debug("Connection is Established.");
            this.clientSocket = clientSocket;
        }

        public void run(){
            ObjectOutputStream outToClient = null;
            ObjectInputStream inFromClient = null;

            try{
                outToClient = new ObjectOutputStream(clientSocket.getOutputStream());
                inFromClient = new ObjectInputStream(clientSocket.getInputStream());
            }
            catch(IOException ex){
                LOGGER.error("There is a problem in reading or writing.");
            }
            while(true){
                try{
                    String userOption =(String)inFromClient.readObject();//while printing stack trace, it says there is something wrong with this line. i don't know why!
                    System.out.println(userOption);
                    userOption = DataEditor.editOptionInputInfo(userOption); //this is a custom method 
                    Map<String,Service> mapper=    CustomClassLoader.loadClass();    //in class loader .class files will be loaded and an object of each of them will be sent in a map
                    if(mapper == null){
                        LOGGER.debug("no class file found to be loaded.");
                        clientSocket.close();
                        break;
                    }

                    List<String> classNames = CustomClassLoader.getClassNames();
                    boolean ckeckedUserOption = Validation.validUserOption(classNames,userOption);

                        if(ckeckedUserOption == false){
                            LOGGER.error("client has entered the wrong option.");
                        }

                        System.out.println(userOption + "in server class------------- before loading class");
                        Service service = mapper.get(userOption);
                        List<String> parameters = service.getRequiredParameters();
                        if(parameters.size() == 0){
                            LOGGER.debug("There is a problem with loaded classes.");
                        }

                        outToClient.writeObject(parameters);
                        LOGGER.debug("required parameters was sent to client.");
                        List<String>info = (List<String>)inFromClient.readObject();
                        LOGGER.debug("Information from client has been sent.");

                        if(info.size() == 0){
                            LOGGER.error("client has not put information. Try again.");
                            System.exit(2);
                        } 

                        String result = service.doOperation(info);
                        outToClient.writeObject(result);
                        LOGGER.debug("Result of required service was sent to client.");

                        inFromClient.close();
                        outToClient.close();
                        //clientSocket.close();

                }catch(IOException ex){
                    LOGGER.error("Exception caught when trying to listen on port "
                        + " or listening for a connection");
                        ex.printStackTrace();
                }
                catch(ClassNotFoundException ex){
                    LOGGER.error("class was not found.");
                }
            }   
        }
    }
// this is client side

package reg.main;
import java.net.*;
import java.io.*;
import java.util.*;
import java.util.Scanner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

//Client class

    public class Client{
        private final static Logger LOGGER = LoggerFactory.getLogger(Client.class);

        public static void main(String[] args){


            Socket clientSocket = null; 
            String userOption;

            InputStream inputStream = null;
            Properties prop = new Properties();

            try{
                String filename = "config.properties";
                inputStream = Client.class.getClassLoader().getResourceAsStream(filename);
                if(inputStream == null){
                   System.out.println("Sorry, unable to find " + filename);
                }
                prop.load(inputStream);
                }
                catch(IOException ex){
                    System.out.println("properties file does not exist.");
                }
            try{
                Scanner input = new Scanner(System.in);
                System.out.println("Do you want to sign in or login? put the file name in:");
                String path = input.next();
                LOGGER.debug("User entered " + path + " as the service option.");
                String port = prop.getProperty("port");
                int portNo = Integer.parseInt(port);
                FileReader fileReader = new FileReader(path);
                BufferedReader reader = new BufferedReader(fileReader);
                userOption = reader.readLine();

                clientSocket = new Socket("192.168.121.114", portNo);
                System.out.println("client is connected to the server.");

                ObjectOutputStream outToServer = new ObjectOutputStream(clientSocket.getOutputStream());
                ObjectInputStream inFromServer = new ObjectInputStream(clientSocket.getInputStream());

                outToServer.writeObject(userOption);
                LOGGER.debug("sent the user option to server ==> " + userOption);

                List<String> listOfparams =(List<String>)inFromServer.readObject();
                LOGGER.debug("List of Requierements in Client " + listOfparams);
                List<String> info = new ArrayList<String>();
                for(String param : listOfparams){
                    System.out.println("Enter your " + param + ": ");
                    info.add(input.next());
                }
                outToServer.writeObject(info);
                String result = (String)inFromServer.readObject();
                LOGGER.debug("The result of required service: " + result);
                System.out.println(clientSocket.isClosed());

                inFromServer.close();
                outToServer.close();
                clientSocket.close();

            } catch (UnknownHostException e) {
                LOGGER.error("Don't know about host ");
                System.exit(1);
            } catch (IOException e){
                LOGGER.error("Couldn't get I/O for the connection to the host or there is no service for loading");
                System.exit(1);
            }
              catch(ClassNotFoundException ex){
                 LOGGER.error("class does not found.");
            }
        }
    }

我感谢任何帮助。提前谢谢你

1 个答案:

答案 0 :(得分:1)

在catch

中使用break
            try{
                String filename = "config.properties";
                input = Application.class.getClassLoader().getResourceAsStream(filename);
                if(input == null){
                    System.out.println("Sorry, unable to find " + filename);
                }
                prop.load(input);
            }
            catch(IOException ex){
                System.out.println("properties file does not exist.");
                break; // this make program to go out of the loop
            }