Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

nyac55

Problem z projektem pisanym pod Linuxa?

Polecane posty

Dawno nie pisałem nic sieciowego, ale w ciemno mogę założyć, że poza klientem będziesz też potrzebował serwera (osobnej aplikacji), który w najprostszej postaci kontroluje całą komunikację.

Jeżeli zupełnie nie wiesz, jak się do tego zabrać, zacznij od prześledzenia tego.

Link do komentarza
Udostępnij na innych stronach

Dodatkowo wymyśliłem, że na początku aplikacja powinna losowo podawać jakąś literę na jaką każde pole ma się zaczynać np. A -> Andora itd. oraz jeśli użytkownik wypisze wszystkie pola powinna odliczać czas od 10 w dół do 0, jeśli to się stanie aplikacja np. przez sieć wysyła pola innego bliźniaczego hosta w sieci np. pojedynczo np. do naszego hosta przekaże pole np. Azerbejdżan ,a hostowi bliźniaczemu pole Andora, tak żeby można było sprawdzić punkty w grze. Tak kolejno musi przejść przez wszystkie pola.

_+_+_

Odnośnie serwera, czy własności serwera mogą znajdować się bezpośrednio w grze np. gra zawiera swoją funkcjonalość+ komunikację sieciową, na 2 komputerach w sieci odpalamy tą grę i w sieci gry (hosty już się widzą) - 1 z gier to serwer, a 2 klient?

Link do komentarza
Udostępnij na innych stronach

Rany, pisałeś to na bani? Trzy razy "np." ciągiem w jednym zdaniu. Ja w ogóle nie rozumiem tej części Twojego posta przed "_+_+_".

Co do architektury klient-serwer. Nie jest ona obowiązkowa, można sobie zrobić architekturę równorzędną, teraz to się zwie p2p. Musisz jedynie zrobić jakąś formę rozgłaszania, broadcast. Poczytaj sobie o http://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol

Link do komentarza
Udostępnij na innych stronach

Obecnie potrzebuję pomocy z napisaniem czegoś co jest wysyłane przez sieć, może to być np. losowa literka, na jaką zaczynać mają się wszystkie hasła w grze.

_+_+_

Przeczytałem to co mi polecił Webtom i napisałem to:

/edit

oraz wzorowałem się na tym filmiku, także:

Na razie jest to komunikacja po stronie serwera, nie jest w całości dobrze, dlatego proszę wskazać mi to co powinienem zmienić lub usunąć. Chciałbym, żeby tworzony Socket był napisany prostym przejrzystym językiem jak dla laika, tak aby wszystko dało się zrozumieć np. tak jak wygląda GUI.

Proszę o porady. smile_prosty.gif

____________________________

Obecnie rozbiłem kod programu na 2 klasy, z czego mam jak myślę dość niewielki błąd na funkcji głównej programu:

/edit

_+_+_+_

Obecnie mam coś takiego:

1.Program główny wywołujący klasy; Main


/*
TCP/IP Main // Program główny wywołujący klasy; Main
*/
package gra;
/**
*
* @author Patryk
*/
public class Main {
public static void main(String[] args) {


//Gra Server = new Gra();

Gra gra = new Gra();
Serwer server = new Serwer();
server.run();

Klient klient = new Klient();
klient.run();
}

}

2.klasa Gra tworząca okno


package gra;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.net.*;
import java.io.*;

public class Gra
{
public Gra(){ //klasa Gra tworząca okno
JFrame frame = new JFrame("Państwa-Miasta");
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(0, 6, 0, 0));
JLabel label1 = new JLabel ("Państwa");
JLabel label2 = new JLabel ("Miasta");
JLabel label3 = new JLabel ("Zwierzęta");
JLabel label4 = new JLabel ("Rośliny");
JLabel label5 = new JLabel ("Rzeczy");
JLabel label6 = new JLabel ("Punkty");
JTextField text1 = new JTextField("");
JTextField text2 = new JTextField("");
JTextField text3 = new JTextField("");
JTextField text4 = new JTextField("");
JTextField text5 = new JTextField("");
JTextField text6 = new JTextField("");
panel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
panel.add(label1);
panel.add(label2);
panel.add(label3);
panel.add(label4);
panel.add(label5);
panel.add(label6);
panel.add(text1);
panel.add(text2);
panel.add(text3);
panel.add(text4);
panel.add(text5);
panel.add(text6);
frame.add(panel, BorderLayout.NORTH);

////
/*String hostName = args[0];
int portNumber = Integer.parseInt(args[1]);

try(
Socket echoSocket = new Socket(hostName, portNumber);
PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader( new InputStreamReader(echoSocket.getInputStream()));
BufferedReader stdIn = new BufferedReader(new InputStreamReader(system.in));
)
*/ ///
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 400);
}
}


3.Serwer


/*
TCP/IP Serwer
*/
package gra;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Serwer {
//Gra Server = new Gra();
Serwer Server = new Serwer();
//
// ---
public void run() throws Exception
{
ServerSocket serwerSocket = new ServerSocket(444); //SRVSOCK
Socket socket1 = serwerSocket.accept(); //SOCK
InputStreamReader inputReader = new InputStreamReader(socket1.getInputStream());
BufferedReader bufferedReader = new BufferedReader(inputReader);

String Message = bufferedReader.readLine();
System.out.println(Message);

if(Message != null)
{
PrintStream printStream = new PrintStream(socket1.getOutputStream());
printStream.println("Message received");
}
Server.run();
}
}

4.Klient


/*
TCP/IP Klient
*/
package gra;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Klient {
public void run() throws Exception
{
Socket klientSocket = new Socket("localhost",444); // Czy nazwa socketu w kliencie oraz serwerze musi być taka sama?
PrintStream printStream = new PrintStream(klientSocket.getOutputStream());
printStream.println("Hello to SERVER from CLIENT.");

InputStreamReader inputReader = new InputStreamReader(klientSocket.getInputStream());
BufferedReader bufferedReader = new BufferedReader(inputReader);

String Message = bufferedReader.readLine();
System.out.println(Message);
}
}

Dane mają być transportowane za pomocą protokołu TCP.

Mam pytanie: Czy nazwa Socketa w kliencie oraz na serwerze ma być taka sama?

Pisałeś, aby w klasie Gra stworzył obiekt i nie używał konstruktora, jak powinienem to zrobić? żeby obiekt robił to samo co konstruktor?

Myślę, że przez sieć aplikacji powinna być rozsyłana literka generowana losowo oraz po zakończeniu tury mogą być wysyłane wyrazy z pól, aby każdy gracz mógł sobie sprawdzić i np. przydzielić punkty.

Link do komentarza
Udostępnij na innych stronach

Nie bardzo rozumiem, czego dokładnie tyczy się pytanie o nazwę Socketu. Zmienne oczywiście nie muszą się nazywać tak samo, jedynie w kliencie podajesz adres IP serwera (obecnie localhost), jedyne, co musi być takie samo, to port.

Co do konstruktora, to ponownie nie wiem, o co dokładnie chodzi. Ale ponownie przyczepiam się do


Serwer Server = new Serwer();

Taki zapis powoduje, ze tworzona instancja klasy Serwer tworzy kolejną, ta jeszcze kolejną i tak do momentu, kiedy zabraknie pamięci. Podobnie wywołanie Server.run() wywoływałoby się rekurencyjnie w nieskończoność. Obecnie nie widzę żadnego zastosowania tego pola.

Obecny kod z main'a też nie zadziała - najpierw odpalasz serwer, który oczekuje na połączenie z klientem i dopiero po takim połączeniu (które nie ma szans się nawiązać) tworzysz klienta, który ma się z serwerem połączyć... Możnaby to rozwiązać tworzeniem wątków, ale że docelowo łączyć się mają osobne aplikacje, to lepiej od razu je stworzyć.

I przydzielaniem punktów mógłby się zająć program smile_prosty.gif

Link do komentarza
Udostępnij na innych stronach

Nie bardzo rozumiem, czego dokładnie tyczy się pytanie o nazwę Socketu

Po stronie klienta mam np. taki zapis:


Socket klientSocket = new Socket("localhost",444); // Czy nazwa socketu w kliencie oraz serwerze musi być taka sama?
PrintStream printStream = new PrintStream(klientSocket.getOutputStream());
printStream.println("Hello to SERVER from CLIENT.");

InputStreamReader inputReader = new InputStreamReader(klientSocket.getInputStream());
BufferedReader bufferedReader = new BufferedReader(inputReader);

Tutaj nazwa socketu to klientSocket, localhost i port 444, następnie w linii niżej mam zapis:

1.

klientSocket.getOutputStream()

oraz

2.


klientSocket.getInputStream()

funkcja getOutputStream wysyła wiadomość na serwer, natomiast getInputStream odbiera wiadomość z serwera, tak?

- - - -

Następnie po stronie serwera mam zapis:


ServerSocket serwerSocket = new ServerSocket(444); //SRVSOCK
Socket socket1 = serwerSocket.accept(); //SOCK
InputStreamReader inputReader = new InputStreamReader(socket1.getInputStream());
BufferedReader bufferedReader = new BufferedReader(inputReader)

,tutaj nazwa socketu dla serwera to serwerSocket, na porcie 444. Następnie w linii niżej mam:


Socket socket1 = serwerSocket.accept();

Ten zapis powoduję akceptację połączenia soketu serwera serwerSocket oraz socketu klienta socket1. Czy nazwa po stronie klienta dla socketu klienta musi być taka sama, aby nawiązać komunikację, czy nie ma to znaczenia? i liczy się tylko adres IP i port?

_+_+_

Następnie co do zapisu:


Serwer Server = new Serwer();

Jak inaczej powinienem to rozwiązać, jakiego zapisu użyć?

_+_+_

ale że docelowo łączyć się mają osobne aplikacje, to lepi...

Czy chodzi ci o to, że powinienem stronę klienta zrobić w 1 projekcie? natomiast stronę serwera w 2?

Link do komentarza
Udostępnij na innych stronach

Nazwy zmiennych odpowiadających sobie socketów nie muszą być takie same, wystarczy, żeby był ten sam port i podany przez klienta adres był adresem serwera.

Dokładniej to funkcje getOutputStream i getInputStream zwracają odpowiednio strumień wyjściowy i wejściowy (i dopiero przez te strumienie odbywa się wysyłanie wiadomości).

Co do


Serwer Server = new Serwer();

to tworzeniem instancji tej klasy zajmuje się już funkcja main i ta jedna instancja w zupełności wystarcza, rekurencyjne tworzenie kolejnych do niczego się nie przydaje, bo do czego w obiekcie klasy Serwer jest Ci potrzebny kolejny obiekt tej samej klasy?

Czy chodzi ci o to, że powinienem stronę klienta zrobić w 1 projekcie? natomiast stronę serwera w 2?

Tak.

Link do komentarza
Udostępnij na innych stronach

Obecnie w Mainie mam to:


/*
TCP/IP Main
*/
package gra;
/**
*
* @author Patryk
*/
public class Main {
public static void main(String[] args) throws Exception {


//Gra Server = new Gra();
Gra gra = new Gra();

//Serwer server;
//server.run();

//Klient klient; // = null
//klient.run();

}

}

Co do 2 aplikacji: klient i serwer. Do bieżącego projektu dodałem nowy package, w nim 3 klasy: 1 to Main, 2 to serwer, 3 to Gra. Natomiast w 1 aplikacji jest odpowiednio 1 Main, 2 klient, 3 gra.

_+_+_

Po odpaleniu obu projektów nic się nie dzieje, poza tym, że uruchamiają się poprawnie.

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...