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()" **