Проблема связи сервер-клиент

#java #sockets #tcp

#java #сокеты #tcp

Вопрос:

я работаю с примером клиент-серверной программы на Java. Я столкнулся с такой проблемой: я запускаю сервер с портом 8080 и локальным хостом, затем запускаю клиент и делаю запрос. Как только запрос выполнен, обе программы закрывают сокеты theri, поэтому я не могу повторить свои действия. Как я могу использовать один и тот же клиент и один и тот же сервер для выполнения более одного запроса?

     public class Network extends Thread
{
    MasterEdit ME = new MasterEdit();
        private Socket _socket;
        InputStream is; //Data streams
        OutputStream os;
        /**
         * Network class constructor
         */
        public Network(int port, int backlog, InetAddress address)
        {
                //We create an object of SocketFactory
                SocketFactory sf = new SocketFactory();
                //Save server socket
                ServerSocket ss = null;

                try
                {
                        if(address == null) //If there is no host
                        {
                                if(backlog <= 0) //If backlog is not given we create it with port
                                {  ss = sf.createServerSocket(port);
                                    System.out.println("Success");
                                }
                                else
                                        ss = sf.createServerSocket(port, backlog); //If backlog is given we just create it
                        }
                        else
                                ss = sf.createServerSocket(port, backlog, address); //If everything is given we create it using data
                }
                catch(Exception e)
                {
                        //Exception with creation of socket
                        System.err.println("Failed open server socket");
                        System.exit(1); //Stop program and send 1 as a exception-code
                }

                while(true) //Listening to the socket
                {
                        try 
                        {
                                StartThread(ss.accept()); //If client has connected we send him to the daemon
                        } 
                        catch (IOException e) 
                        {
                                e.printStackTrace();
                        }
                }

        }

        /**
         * Start daemon-tool when client has connected
         */
        private void StartThread(Socket ss)
        {
                _socket = ss; //initializing of global variable

                setDaemon(true); //anounce that new potok is daemon
                setPriority(NORM_PRIORITY); //set the priority
                start(); //Start it
        }

        @Override
        public void run()
        {   
                byte buffer[] = new byte[64*1024]; //buffer in 64 kb
                try
                {
                        is = _socket.getInputStream();
                        os = _socket.getOutputStream(); //Initializing the output stream to a client
                        String toClient = SearchRequest(new String(buffer, 0, is.read(buffer)));
                        os.write(toClient.getBytes()); //Sending an answer
                }
                catch(Exception e)
                {
                        e.printStackTrace();
                }

        }

        private String SearchRequest(String request)
        {
                String info = ""; //Initializing of a variable

                if(request.equalsIgnoreCase("info")) //Check the request
                {
                        //Adding data
                        info  = "Virtual Machine Information (JVM)n";
                        info  = "JVM Name: "   System.getProperty("java.vm.name") "n";
                        info  = "JVM installation directory: "   System.getProperty("java.home") "n";
                        info  = "JVM version: "   System.getProperty("java.vm.version") "n";
                        info  = "JVM Vendor: "   System.getProperty("java.vm.vendor") "n";
                        info  = "JVM Info: "   System.getProperty("java.vm.info") "n";
                        return info; //Give the answer
                }
                if(request.charAt(0)=='0') {
                    StringTokenizer rm = new StringTokenizer(request, " tnr,:");
                    rm.nextToken();
                    ME.MasterDell(Double.parseDouble(rm.nextToken()), Double.parseDouble(rm.nextToken()), Double.parseDouble(rm.nextToken()), Double.parseDouble(rm.nextToken()));
                    return "Successfully deleted";
                }
                if(request.charAt(0)=='1'){
                    StringTokenizer temp = new StringTokenizer(request, " tnr,:");
                    temp.nextToken();
                    ME.MasterAdd(Double.parseDouble(temp.nextToken()), Double.parseDouble(temp.nextToken()), Double.parseDouble(temp.nextToken()), Double.parseDouble(temp.nextToken()), Double.parseDouble(temp.nextToken()), Double.parseDouble(temp.nextToken()), temp.nextToken());
                    return "Successfully added";
                }
                this.ClostIt();
                return "Bad request"; //bad request
        }
        public void ClostIt() {
                try {
                    is.close();
                       os.close();
                        _socket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

        }
}
  

Это серверная часть. Он использует класс SocketFactory, но в основном он просто создает сокет в начале. В основной программе я вызываю новую сеть (ПОРТ, НЕВЫПОЛНЕННАЯ работа, исходный адрес.getByName (хост));

Ответ №1:

Я предполагаю, что в вашей серверной программе у вас нет цикла, а скорее что-то вроде этого:

 public static void main( String args[] ) {
 ServerSocket server = new ServerSocket(...);
 Socket con = server.accept();
 //process the client connection ...
 //done, exit!
}
  

вместо

 public static void main( String args[] ) {
 ServerSocket server = new ServerSocket(...);
 Socket con = null;
 while( condition /* e.g. shutdown server message received */ ) {
   con = server.accept();
   //process the client connection ...
   //then keep waiting for the next request
 }
 //done, exit!
}
  

Имейте в виду, что приведенный выше пример обрабатывает только одного клиента одновременно! вам нужно будет перейти на многопоточность для одновременной обработки клиентов.

Ответ №2:

Это хорошее начало для многопоточного сервера

http://www.kieser.net/linux/java_server.html

Отметить