Sieci Komputerowe

Programowanie socketów. Różne języki *

Java

Przykład, server zamieniający komunikat na wielkie litery:

import java.io.*;
import java.net.*;

class tcp
{
        public static void main(String argv[]) throws Exception
        {
                String clientSentence;
                String capitalizedSentence;
                ServerSocket welcomeSocket = new ServerSocket(6789);

                while(true)
                {
                        Socket connectionSocket = welcomeSocket.accept();
                        BufferedReader inFromClient =
                        new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
                        DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
                        clientSentence = inFromClient.readLine();
                        System.out.println("Received: " + clientSentence);
                        capitalizedSentence = clientSentence.toUpperCase() + '\n';
                        outToClient.writeBytes(capitalizedSentence);
                }
        }
}

Klient, przykład:

import java.io.*;
import java.net.*;

/**
* Usage:input a string, server will return a value.
**/

class TCPClient {
        public static void main(String argv[]) throws Exception {
                String sentence;
                String modifiedSentence;
                BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
                Socket clientSocket = new Socket("localhost", 6789);
                DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
                BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                sentence = inFromUser.readLine();
                outToServer.writeBytes(sentence + '\n');
                modifiedSentence = inFromServer.readLine();
                System.out.println("FROM SERVER: " + modifiedSentence);
                clientSocket.close();
        }
}

Więcej informacji

Pascal

Zadanie (5 pkt)

Zadaniem Państwa jest napisanie programu grającego w grę kółko i krzyżyk na planszy 5x5, gdzie wygrywającymi układami są proste poziome, pionowe oraz przekątne. Państwa program gra z komputerem a w przypadku remisu na koniec gry, jest on traktowany jak Państwa wygrana. Program rozgrywa po 50 gier i jego zadaniem jest wygranie co najmniej 40 z nich.

Komunikacja z serwerem: Na powitanie Serwer przesyła komunikat:

WELCOME, STATE YOUR NAME

I oczekuje od klienta na wysłanie Swojego loginu w postaci

LOGIN imie_nazwisko

Każdy poprawnie odebrany i sparsowany komunikat przez serwer potwierdzany jest komunikatem OK, każdy błędny komunikat oznaczany jest przez serwer poprzez przesłanie do klienta ERROR.

Następnie serwer czeka na spis ruchów użytkownika w postaci:

MOVE nr między 0 a 25

W odpowiedzi wysyłany jest albo ruch przeciwnika postaci:

OPPONENT nr między 0 a 25

Albo komunikat o wygranej

WIN

albo pregranej

LOST

Po wygranej lub przegranej przesyłany jest także komunikat o rozpoczęciu nowej gry

NEW GAME

I serwer oczekuje na ruch użytkownika w nowej grze.

Po zakończeniu 50 gier użytkownik powiadamiany jest o wykonaniu zadania - komunikat "SUCCESS" lub porażce - komunikat "FAILED" i serwer kończy komunikację z użytkownikiem (zamyka socket).

Jako rozwiązanie proszę także przesłać w mailu kod państwa programu.

PROJEKT

Zadanie to implementacja SERWERA i dwóch klientów gry o nazwie BLEF.

W grze używa się normalnej talii o 52 kartach. W grze brać będzie udział 10 osób. W pierwszej rundzie gry każdy gracz otrzymuje po jednej karcie, i wybrany gracz rozpoczyna licytację. Podczas licytacji kolejni gracze próbują przewidzieć możliwy układ pokerowy, który wystąpił w puli wszystkich rozdanych kart, na podstawie kart w swoim ręku oraz zgłoszeń innych graczy. Jeżeli kolejny gracz uważa, że ostatnie zgłoszenie nie pokrywa się z rzeczywistością, może zażądać sprawdzenia. Jeśli ostatnie zgłoszenie zgadza się, przegrywa rundę sprawdzający, jeśli nie, ostatnio licytujący. Po przegranej rundzie przegrany gracz zbiera karty, tasuje, rozdaje, i kolejny gracz rozpoczyna nową rundę - gracz, który ostatnio przegrał we wszystkich kolejnych rundach będzie otrzymywał o jedną kartę więcej. Z tego powodu w kolejnych rundach liczba rozdanych kart wzrasta, zatem jest coraz wyższa szansa na rzadsze kombinacje.

Grę przegrywa gracz, który osiągnie ustalony limit kart, dla nas będzie to 5 kart, czyli jeśli rundę przegrał gracz z 4 kartami w ręku, odpada on z dalszej rywalizacji. Grę wygrywa gracz, który pozostanie sam w grze.

Jeżeli jakiś z graczy poda najwyższy możliwy układ - duży poker (A,K,D,W,10) pikowy, to kolejny gracz nie ma wyboru i musi go sprawdzić.

Karty oznaczać będziemy w postaci: 2,3,4,5,6,7,8,9,10,W,D,K,A

Starszeństwo układów pokerowych:

poker (P)
kareta (wartość) (K)
full (wartość, wartość) (F)
kolor (kolor) (L)
strit (S)
trójka (wartość) (T)
dwie pary (wartość, wartość) (W)
para (wartość) (R)
wysoka karta (wartość) (V)

Starszeństwo kolorów:

pik (S - spades)
kier (H - hearts)
karo (D - diamonds)
trefl (C - clubs)

W przypadku fulla, za ważniejszy parametr uważa się wartość określającą trzy z pięciu kart. W przypadku dwóch par za ważniejszy parametr uważa się wyższą wartość.

Serwer każdą poprawną komendę potwierdza komunikatem "OK", każdą niepoprawną oznacza wysyłając "ERROR".

OPIS KOMEND:

W momencie połączenia serwer przesyła do użytkownika komunikat

POLACZONO

Przed włączeniem się do gry każdy gracz musi się "zalogować" podając swój login (niepusty ciąg znaków)

LOGIN <login>

W momencie, gdy 10 osób włączy się do gry, gra zostaje uruchomiona a serwer przesyła do zawodników komunikat wraz z numerem danego gracza i numerem zawodnika zaczynającego grę

START <twój ID> <id_zawodnika_zaczynającego grę>

Następnie kazdy użytkownik otrzymuje informacje o kartach jakie wylosował (stosując nazewnictwo kolorów i wartości podane powyżej)

<liczba kart> <karta1> <karta2> <karta3> ....
np. 4 2S 3H AS KC

Użytkownik, który ma wykonać ruch otrzymuje od serwera komunikat

TWOJ RUCH

Na który w ciągu 3 sekund musi odpowiedzieć podając albo układ pokerowy albo komendę sprawdzenia

CHECK

(gracz grający jako pierwszy nie może podać CHECK jako odpowiedzi), podany układ pokerowy musi być zawsze "wyższy" od podanego przez poprzedniego gracza

Komendy układów:

Poker:

P <karta początkowa>
np. P 2S oznacza poker 2S 3S 4S 5S 6S, itd, stąd najwyższy możliwy układ to P 10S

Kareta:

K <wartosc_karty>
np. K K (kareta króli)

Full:

F <wartość_trójki> <wartość_dwójki>
np. F 3 K (full 3,3,3,K,K), wartości dla trójek i dwójek muszą być różne!

Kolor:

L <kolor>
np. L D (kolor w kierach)

Strit:

S <wartosc początkowa>
np. S 2 oznacza strita 2,3,4,5,6 itd., stąd najwyższy możliwy strit to S 10

Trójka:

T <wartość_trójki>
np. T 3 (trójka 3,3,3)

Dwie pary:

W <wartość_dwójki> <wartość_dwójki>
np. W A 4 (dwójka A,A,4,4), wartości dla obu dwójek muszą być różne!

Para:

R <wartość_dwójki>
np. R A (para asów)

Wysoka karta:

V <wartość>
np. V A (jeden As)

W kazdej rundzie pozostali zawodnicy są informowani o ruchach przeciwników w postaci

<id gracza> <układ>

lub

<id gracza> CHECK

Gracz, który wysłał CHECK (i tylko on) informowany jest o jego sukcesie poprzez komunikat

SUKCES

lub

PORAZKA

W drugim przypadku następuje koniec rundy i serwer przesyła wszystkim zawodnikom wynik rundy (pozwalające określić kto blefował)

<liczba graczy> <id_gracza1> <liczba_kart_gracza_1> <karta1_gracza_1> ... <id_gracza2> <liczba_kart_gracza_2> <karta1_gracza_2> ...
np. 3 0 1 AS 1 2 3D 4H 2 1 3S

następnie przesłany jest aktualny stan gry na kolejną rundę:

<liczba graczy> <id_gracza1> <liczba_kart_gracza1> <id_gracza2> <liczba_kart_gracza2> ....
np. 3 0 1 1 3 2 1

Powyższy komunikat przesyłany jest nawet w przypadku gdy zostaje tylko 1 gracz. Następnie przesyłany jest komunikat o kolejnej rundzie

RUNDA <nr_rundy> <id_gracza rozpoczynajacego>

lub

KONIEC <uszerwegowane_loginy_graczy_od wygranego do ostatniego miejsca>
np KONIEC s123456 s654321 s123987 ...

Dodatkowe założenia:

  • z jednego adresu IP może połączyć się z nami tylko jeden użytkownik,

  • w przypadku, gdy klient nie odpowiada przez 3 sekundy jest wyrzucany z gry,

  • w przypadku gdy klient wyśle powyżej 100 złych komunikatów, jako pojedyncza odpowiedź jest on wyrzucany z gry, w takim wypadku wymuszamy na nim CHECK, który konczy się niepowodzeniem (z punktu widzenia innych graczy tak to "wygląda"),

Państwa serwer i klient musi implementować powyższy protokół komunikacji. Dodatkowo mają Państwo za zadanie stworzyć drugi program kliencki, którego celem jest wywołanie błędu, oszukanie, lub spowodowanie błędu serwera. Wszelkie sposoby (dozwolone prawnie), w tym ataki na serwer są akceptowane. Program ten jednak musi się najpierw zalogować w serwerze (wysłac poprawnie przynajmniej komunikat LOGIN).

Programu powinny logować informację,które sprawią że w przypadku sytuacji konfliktowych będziemy w stanie rozstrzygnąć kto popełnił błąd (serwer, czy aplikacja klienta).

Serwer musi zapisywac (logowac) do pliku cala komunikacje pomiedzy nim a klientami.

Program może być wykonany w dowolnym języku programowania ale musi wykorzystywać do komunikacji protokół TCP. Termin wykonania zadania: 10.05.2016.

*

Wykorzystano materiały z:

https://gist.github.com/roroco/11131088