Serwer - Sockety

0

"Krótko o działaniu aplikacji. Po uruchomieniu serwer oczekuje na połączenie. Po połączeniu serwer wysyła do klienta komunikat "Ping" i oczekuje na odpowiedź. Jeśli klient odpowie "Pong" to serwer po 5 sekundach ponownie wysyła "Ping". W przypadku otrzymania złej odpowiedzi serwer się wyłącza.

Klient sprawdza nadchodzące komunikaty, jeśli otrzyma "Ping" to odpowiada "Pong". Dla celów testowych klient po 30 sekundach działania wyśle komunikat "Pon g" zamiast "Pong" i się wyłączy."

Stworzyłem klasę Client i Server, gdzie są zachowane wszystkie procesy. Pojawiła się masa wymogów, że konieczne jest stworzenie wyjątków - zrobiłem dla praktycznie każdej nowej linijki, nie wiem, czy nie zaburzyłem płynności procesu. Sytuacja wygląda tak, że klikam button "bStworzSerwer" i cały program się zawiesza. Co poprawić? Mogę udostępnić główne kody z klientem i serwerem.

   

if (source == bStworzSerwer)
      {
         /*Utworzenie na podanym porcie socketa serwera.*/
         ServerSocket serverSocket = null;
         try {
            serverSocket = new ServerSocket(Server.getPORT());
         } catch (IOException e1) {
            e1.printStackTrace();
         }

         /*Oczekiwanie na połączenie i zaakceptowanie*/
         Socket clientSocket = null;
         try {
            clientSocket = serverSocket.accept();
         } catch (IOException e1) {
            e1.printStackTrace();
         }

         /*Utworzenie strumieni wejściowego i wyjściowego*/
         BufferedReader in;
         try {
            try (PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
               in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

            /*Wysłanie komunikatu*/
               out.println("Hello");

            /*Oczekiwanie i odebranie komunikatu*/
               String input = in.readLine();
               in.close();

            /*Zamknięcie strumieniu i socketów*/
               out.close();
            }
         } catch (IOException e1) {
            e1.printStackTrace();
         }

         //in.close();

         try {
            clientSocket.close();
         } catch (IOException e1) {
            e1.printStackTrace();
         }
         try {
            serverSocket.close();
         } catch (IOException e1) {
            e1.printStackTrace();
         }
      }

      if (source == bDołącz)
      {
         try {
            Socket socket = new Socket(Client.getHOST(), Server.getPORT());
         } catch (IOException e1) {
            e1.printStackTrace();
         }
      }
0

i cały program się zawiesza.

GDZIE się zawiesza ? skąd wiesz że wgl łączysz się z klientem ? accept oczekuje na połączenie, jest blokujące.

0

Po prostu po kliknięciu przycisku ustaje jakiekolwiek działanie programu, nawet się go nie da wyłączyć. A klient podłącza się do serwera po ponownym odpaleniu programu w konsoli - tak to w teorii zaplanowałem. Co zmienić w takim razie?

0

A klient podłącza się do serwera po ponownym odpaleniu programu w konsoli - tak to w teorii zaplanowałem.

KLIKASZ GUZIK i serwer zaczyna nasłuchiwać na porcie

new ServerSocket(Server.getPORT());

  • rozumiem że tutaj blokuje ? łączysz się do tego serwera ? co się dzieje, napisz nam GDZIE się blokuje, aktualnie nikt nie jest w stanie ci pomóc, bo dałeś kawałek kodu i napisałeś że nie działa.
0

Nie wiem jak to zweryfikować, program się po prostu nagle zawiesza po wciśnięciu przycisku, który odpala serwer. Jakieś pomysły? Jeśli wcisnę ten związany z klientem - nic nie szwankuje (chyba, że go przycisnę przed odpaleniem serwera, to wywala masę wyjątków). W konsoli nie ma w każdym razie żadnych odpowiedzi jak wszystko zrobię według kolejności.

Serwer

package com.company;/* Server.java */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server
{
   public static int getPORT() {
      return PORT;
   }

   private static final int PORT = 50000;
   static boolean flaga = true;

   private static ServerSocket serverSocket;
   private static Socket clientSocket;

   public static void main(String[] args) throws IOException
   {
      serverSocket = null;
      try
      {
         serverSocket = new ServerSocket(PORT);
      }
      catch(IOException e)
      {
         System.err.println("Could not listen on port: "+PORT);
         System.exit(1);
      }

      System.out.print("Wating for connection...");

      Thread t = new Thread(new Runnable()
      {
         public void run()
         {
            try
            {
               while(flaga)
               {
                  System.out.print(".");
                  Thread.sleep(1000);
               }
            }
            catch(InterruptedException ie)
            {
               //
            }

            System.out.println("\nClient connected on port "+PORT);
         }
      });
      t.start();

      clientSocket = null;
      try
      {
         clientSocket = serverSocket.accept();
         flaga = false;
      }
      catch(IOException e)
      {
         System.err.println("Accept failed.");
         t.interrupt();
         System.exit(1);
      }

      final PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),true);
      final BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

      t = new Thread(new Runnable()
      {
         public void run()
         {
            try
            {
               Thread.sleep(5000);

               while(true)
               {
                  out.println("Ping");
                  System.out.println(System.currentTimeMillis()+" Ping sent");

                  String input = in.readLine();

                  if(input.equals("Pong"))
                  {
                     System.out.println(System.currentTimeMillis()+" Pong received");
                  }
                  else
                  {
                     System.out.println(System.currentTimeMillis()+" Wrong answer");

                     out.close();
                     in.close();
                     clientSocket.close();
                     serverSocket.close();
                     break;
                  }


                  Thread.sleep(5000);
               }
            }
            catch(Exception e)
            {
               System.err.println(System.currentTimeMillis()+" Unexpected Error");
            }
         }
      });
      t.start();
   }
}

Klient

package com.company;

/* Client.java */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Client
{
   private static final int PORT = 50000;

   public static String getHOST() {
      return HOST;
   }

   private static final String HOST = "localhost";

   public static void main(String[] args) throws IOException
   {
      Socket socket = null;

      try
      {
         socket = new Socket(HOST, PORT);
      }
      catch(Exception e)
      {
         System.err.println("Could not connect to "+HOST+":"+PORT);
         System.exit(1);
      }

      final PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
      final BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

      Thread t = new Thread(new Runnable()
      {
         public void run()
         {
            long start = System.currentTimeMillis();

            while (true)
            {
               try
               {
                  String input = in.readLine();

                  if (input != null)
                  {
                     System.out.println(System.currentTimeMillis() + " Server: " + input);
                  }

                  if (input.equals("Ping"))
                  {
                     if(System.currentTimeMillis()-start>30000)
                     {
                        out.println("Pon g");
                        System.out.println(System.currentTimeMillis() + " Client: Pon g");
                        break;
                     }

                     out.println("Pong");
                     System.out.println(System.currentTimeMillis() + " Client: Pong");
                  }
               }
               catch (IOException ioe)
               {
                  //
               }
            }
         }
      });
      t.start();

      out.close();
      in.close();
      socket.close();
   }
}
0

refresh

0

Nie możesz po prostu uruchomić debuggera przed wywołaniem buttona i sprawddzić krokowo w którym momencie program ci się zawiesi ?

1

Spróbuj dać timeout na ServerSocket i zobacz co się dzieje.

0

Zmieniłem nieco program - aktualnie sytuacja wygląda tak, że klient wysyła liczbę, po czym serwer nasłuchuje, a po odebraniu danej przekształca daną liczbę i ją wyświetla na konsoli. Dopiero zaczynam raczkować w stawianiu tych socketów. Potrzebuję zrobić do niedługiego czasu aplikację kółko i krzyżyk, gdzie dwóch klientów będzie się łączyło z serwerem i między sobą grało. Ma ktoś jakiś poradnik, jak połączyć logikę gry z działaniem na linii klient-serwer? Prosiłbym o pomoc.

1

Nie rozumiem co masz za problem tablica 3x3 po stronie klienta wysyla on dwie wartosci np 0,0 (pierwsze pole) 1,0 (drugie pole) 1,1 (4 pole) serwer odsyła ("Dobrze", "Zle", "Wygrales", "Przegrales") - najlepiej jako liczby 0 1 2 3. I wszystko odpowiednio sie zmienia po stronie klienta. Jeżeli jest tura gracza co klika i klika na dobre pole to wysyla Dobrze Jezeli nie to wysyla Zle. Jeżeli po ruchu ktoregos z graczy serwery zauwaza wygrana to wysyla w którąś strone Wygrales a w druga Przegrales

0

Czyli target jest taki, że odpalam serwer, do tego drugi raz tą samą aplikację, która podłącza się jako klient (1) i ponownie to samo, która podłącza się jako klient (2). Pytanie zatem: jak to skonfigurować po stronie serwera, żeby w momencie, jak jeden z nich podejmuje decyzje, drugi gracz nie miał dostępu do panelu (i odwrotnie). Z przesłaniem danych nie ma jako tako problemu.
No i jeszcze jedno: aplikację tworzyć równolegle dla każdego z klientów i serwera, jak rozumiem, i będzie ona osobno edytowana po różnych komunikatach ze strony serwera dla każdej ze stron odpowiednio dla jednego i drugiego gracza?
Ogólnie największy problem to skonfigurować to w taki sposób, żeby serwer wysyłał różne komunikaty dla różnych graczy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1