Aplikacja klient-serwer

0

Dobry wieczór. Tworzę aplikację klient-serwer mającą obsłużyć przez sieć grę "papier, kamień, nożyce". Cały czas mam problem z przesyłaniem danych na linii serwer-klient, a konkretnie z powiązaniem ich z logiką aplikacji. Głównym moim oknem jest "Forma", gdzie zawarta jest struktura gui gry oraz powiązanie buttonów z logiką gry. Także w formie jest zadeklarowana klasa związana z logiką gry (

Gra gra = new Gra()

). Osobne klasy są poświęcone serwerowi oraz klientowi, są w nich zawarte także osobne metody odpowiedzialne na przykład za przesłanie nazwy gracza drugiego do drugiego, oraz przesłanie do klienta nazwy gracza stojącego po stronie serwera - i już na tym etapie napotkałem stek błędów. Być może zachodzi konieczność budowy wątków?
Poniżej zamieszczam najważniejsze klasy - prosiłbym o pomoc w edycji. Na ten moment najważniejsze jest dla mnie przesłanie po starcie aplikacji nazw graczy pomiędzy sobą i pojawienie się ich w dwóch odpalonych równolegle aplikacjach. Następnie po "skumaniu", jak to działa, zajmę się programowaniem dalszych elementów gry.

Serwer:

package com.company;/* Server.java */
import javax.swing.*;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import com.company.Gra;


public class Server {

   public Gra gra = new Gra ();
   public Forma forma;

   boolean value, temp;
   String nazwa_klienta;

   public void run() throws Exception {
      ServerSocket s1 = new ServerSocket(1342);
      Socket ss = s1.accept();
      Scanner sc = new Scanner(ss.getInputStream()); // pobierzemy info od klienta
      value = sc.nextBoolean();

      forma.gra.setTura(false);
      temp = forma.gra.isTura();
      PrintStream p = new PrintStream(ss.getOutputStream()); // wyślemy do klienta
      p.println(temp);

      forma.fGraWieloosobowa();
   }

   public void odbierz_nazwę_klienta () throws Exception
   {
      ServerSocket s1 = new ServerSocket(1342);
      Socket ss = s1.accept();
      Scanner sc = new Scanner(ss.getInputStream()); // pobierzemy info od klienta
      nazwa_klienta = sc.nextLine();
      forma.lNazwa2.setText(nazwa_klienta);
   }
  }

Klient:

package com.company;

   import javax.swing.*;
   import java.awt.event.ActionListener;
   import java.io.*;
   import java.net.ServerSocket;
   import java.net.Socket;
   import java.util.Scanner;
   import com.company.Gra;

public class Client {

   public Forma forma;
   Scanner sc = new Scanner(System.in);

   public void połącz () throws Exception {
      Scanner sc = new Scanner(System.in);
      Socket s = new Socket("127.0.0.1", 1342);
      forma.fGraWieloosobowa();
      forma.gra.setTura(true);
      PrintStream p = new PrintStream(s.getOutputStream()); // serwer otrzyma
      p.println(forma.gra.isTura()); // serwer dostaje liczbę
      s.close();
   }

   public void prześlij_nazwę (String nazwa_dla_serwera) throws Exception {
      Socket s = new Socket("127.0.0.1", 1342);
      int number = 3;
      PrintStream p = new PrintStream (s.getOutputStream());
      p.println(number);
      p.println(nazwa_dla_serwera);
      s.close();
   }
}

Forma:

package com.company;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class Forma extends JFrame implements ActionListener {

   // deklaracje

   public JButton button1,button2,button3,button4,button5,button6;
   public JButton bGraJednoosobowa;

   public JButton bGraWieloosobowa;
   public JButton bWyjscie;
   public JButton bDołącz;
   public JLabel lWyswietlGracz1, lWyswietlGracz2, lNazwa1, lNazwa2, lwynikGracz1, lwynikGracz2;

   Gra gra = new Gra();
   Server server = new Server();
   Client client = new Client();

   // konstruktor

   Forma ()
   {
      setSize(235,400);
      setTitle("Papier, kamień, nożyce");
      setLayout(null);

      bGraJednoosobowa = new JButton("Gra jednoosobowa");
      bGraJednoosobowa.setBounds(20,270,180,20);
      add(bGraJednoosobowa);
      bGraJednoosobowa.addActionListener(this); //button1 źródło zdarzeń, a słuchaczem jest ramka

      bGraWieloosobowa = new JButton("Gra wieloosobowa");
      bGraWieloosobowa.setBounds(20,290,180,20);
      add(bGraWieloosobowa);
      bGraWieloosobowa.addActionListener(this); //button1 źródło zdarzeń, a słuchaczem jest ramka

      bDołącz = new JButton("Dołącz");
      bDołącz.setBounds(20,310,180,20);
      add(bDołącz);
      bDołącz.addActionListener(this); //button1 źródło zdarzeń, a słuchaczem jest ramka

      bWyjscie = new JButton("Wyjście");
      bWyjscie.setBounds(20,330,180,20);
      add(bWyjscie);
      bWyjscie.addActionListener(this); //button1 źródło zdarzeń, a słuchaczem jest ramka

      button1 = new JButton("P");
      button1.setBounds(45,15,50,50);
      add(button1);
      button1.setEnabled(false);
      button1.addActionListener(this); //button1 źródło zdarzeń, a słuchaczem jest ramka

      button2 = new JButton("K");
      button2.setBounds(45,80,50,50);
      add(button2);
      button2.setEnabled(false);
      button2.addActionListener(this); //button1 źródło zdarzeń, a słuchaczem jest ramka

      button3 = new JButton("N");
      button3.setBounds(45,145,50,50);
      add(button3);
      button3.setEnabled(false);
      button3.addActionListener(this); //button1 źródło zdarzeń, a słuchaczem jest ramka

      button4 = new JButton("P");
      button4.setBounds(125,15,50,50);
      add(button4);
      button4.setEnabled(false);
      button4.addActionListener(this); //button1 źródło zdarzeń, a słuchaczem jest ramka

      button5 = new JButton("K");
      button5.setBounds(125,80,50,50);
      add(button5);
      button5.setEnabled(false);
      button5.addActionListener(this); //button1 źródło zdarzeń, a słuchaczem jest ramka

      button6 = new JButton("N");
      button6.setBounds(125,145,50,50);
      add(button6);
      button6.setEnabled(false);
      button6.addActionListener(this); //button1 źródło zdarzeń, a słuchaczem jest ramka

      lWyswietlGracz1 = new JLabel("Gracz1: ");
      lWyswietlGracz1.setBounds(20,220,50,20);
      add(lWyswietlGracz1);

      lWyswietlGracz2 = new JLabel("Gracz2: ");
      lWyswietlGracz2.setBounds(20,240,50,20);
      add(lWyswietlGracz2);

      lNazwa1 = new JLabel("Nie ustawiono");
      lNazwa1.setBounds(75,220,100,20);
      lNazwa1.setForeground(Color.BLACK);
      add(lNazwa1);

      lNazwa2 = new JLabel("Nie ustawiono");
      lNazwa2.setBounds(75,240,100,20);
      lNazwa2.setForeground(Color.BLACK);
      add(lNazwa2);

      lwynikGracz1 = new JLabel("X");
      lwynikGracz1.setBounds(190,220,20,20);
      lwynikGracz1.setForeground(Color.RED);
      add(lwynikGracz1);

      lwynikGracz2 = new JLabel("Y");
      lwynikGracz2.setBounds(190,240,20,20);
      lwynikGracz2.setForeground(Color.RED);
      add(lwynikGracz2);
   }

   // ActionListener

   @Override
   public void actionPerformed(ActionEvent e) {
      Object source = e.getSource();

      if (source == bGraWieloosobowa)
      {
       //  Server server = new Server();
         try {
            server.run();
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }

      if (source == bDołącz)
      {
         try {
            client.połącz();
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }

      if (source == bGraJednoosobowa)
         fGraJednoosobowa();

      if (source == bWyjscie)
         dispose();

      if (source == button1)
      {
         button1.setEnabled(false);
         button2.setEnabled(false);
         button3.setEnabled(false);
         button4.setEnabled(true);
         button5.setEnabled(true);
         button6.setEnabled(true);
         gra.tab[0][0] = 1;
      }

      if (source == button2)
      {
         button1.setEnabled(false);
         button2.setEnabled(false);
         button3.setEnabled(false);
         button4.setEnabled(true);
         button5.setEnabled(true);
         button6.setEnabled(true);
         gra.tab[1][0] = 1;
      }

      if (source == button3)
      {
         button1.setEnabled(false);
         button2.setEnabled(false);
         button3.setEnabled(false);
         button4.setEnabled(true);
         button5.setEnabled(true);
         button6.setEnabled(true);
         gra.tab[2][0] = 1;
      }

      if (source == button4)
      {
         button4.setEnabled(false);
         button5.setEnabled(false);
         button6.setEnabled(false);
         gra.tab[0][1] = 1;
         gra.sprawdzStan();
         ustalZwyciezce();
         wpiszWynik();
      }

      if (source == button5)
      {
         button4.setEnabled(false);
         button5.setEnabled(false);
         button6.setEnabled(false);
         gra.tab[1][1] = 1;
         gra.sprawdzStan();
         ustalZwyciezce();
         wpiszWynik();
      }

      if (source == button6)
      {
         button4.setEnabled(false);
         button5.setEnabled(false);
         button6.setEnabled(false);
         gra.tab[2][1] = 1;
         gra.sprawdzStan();
         ustalZwyciezce();
         wpiszWynik();
      }
   }

   // jednoosobowa

   public void fGraJednoosobowa () {

      bGraJednoosobowa.setText("Nowa gra");

      if ((gra.getGracz1() == "NazwaDomyslna1" && gra.getGracz2() == "NazwaDomyslna2") || (gra.getGracz1().equals("") && gra.getGracz2().equals(""))) {
         gra.setGracz1(JOptionPane.showInputDialog("Gracz 1: "));
         gra.setGracz2(JOptionPane.showInputDialog("Gracz 2: "));
      }

      if ( !gra.getGracz1().equals("") ) {
         lNazwa1.setText(gra.getGracz1());
         lNazwa2.setText(gra.getGracz2());

         gra.tab = new int[][]{
            {-1, -1},
            {-1, -1},
            {-1, -1}};

         button1.setEnabled(true);
         button2.setEnabled(true);
         button3.setEnabled(true);
         button4.setEnabled(false);
         button5.setEnabled(false);
         button6.setEnabled(false);
      }

      else
         JOptionPane.showMessageDialog(null, "Nie wprowadzono danych!");
   }

   // wieloosobowa

   public void fGraWieloosobowa () {

      if (gra.isTura() == false ) {
         if (gra.getGracz1() == "NazwaDomyslna1" || (gra.getGracz1().equals(""))) {
            gra.setGracz1(JOptionPane.showInputDialog("Gracz 1: "));
         }
         lNazwa1.setText(gra.getGracz1());
         try {
            server.odbierz_nazwę_klienta();
         } catch (Exception e) {
            e.printStackTrace();
         }
      }

      if (gra.isTura() == true) {
         if (gra.getGracz2() == "NazwaDomyslna2" || (gra.getGracz2().equals(""))) {
            gra.setGracz2(JOptionPane.showInputDialog("Gracz 2: "));
            lNazwa2.setText(gra.getGracz2());
            try {
               client.prześlij_nazwę(gra.getGracz2()); // serwer otrzyma
            } catch (Exception e) {
               e.printStackTrace();
            }
            // serwer dostaje liczbę
         }
      }

      if (!gra.getGracz1().equals("") && !gra.getGracz2().equals("")) {

         gra.tab = new int[][]{
            {-1, -1},
            {-1, -1},
            {-1, -1}};

         button1.setEnabled(false);
         button2.setEnabled(false);
         button3.setEnabled(false);
         button4.setEnabled(true);
         button5.setEnabled(true);
         button6.setEnabled(true);
      }

      else
         JOptionPane.showMessageDialog(null, "Nie wprowadzono danych!");
   }

   // funkcje

   public void ustalZwyciezce()
   {
      if (gra.getLicznik1() > gra.getLicznik2()) {
         JOptionPane.showMessageDialog(null, "Wygrywa gracz 1");
      }
      if (gra.getLicznik2() > gra.getLicznik1()) {
         JOptionPane.showMessageDialog(null, "Wygrywa gracz 2");
      }
      if (gra.getLicznik1() == gra.getLicznik2()) {
         JOptionPane.showMessageDialog(null, "Remis");
      }

      gra.setLicznik1(0);
      gra.setLicznik2(0);
   }

   public void wpiszWynik ()
   {
      lwynikGracz1.setText(Integer.toString(gra.getGracz1Wynik()));
      lwynikGracz2.setText(Integer.toString(gra.getGracz2Wynik()));
   }
}

**Aktualnie wyjątki w trakcie kompilacji pojawiają się w momencie, gdy po stronie klienta odpalimy "forma.fGraWieloosobowa()" **

0

Napisałeś mnóstwo kodu, nierozdzieliłeś logiki od widoku ciężko pomóc, ale widzę, że oczekujesz na wartość booleowsk'ą na serwerze, why ? Moim zdaniem, za nim weźmiesz się za pisanie programów opartych o GUI powinieneś zaznajomić z książką: Czysty Kod Robert M. Martina, a później nauczyć się tworzyć testy jednostkowe. Powodem tego jest właśnie taka przeplatanina kodu, może lepiej stwórz najpierw program bez GUI ? Dodasz je późnej jak usilnie je chcesz. Hmm najlepiej do wejścia i wyjścia ustaw BufferedReader/PrintWriter readerem czytaj .nextLine() a writerem wysyłaj .println()

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