Eval [ "Betöltjük a szükséges csomagokat" PackageLoader fileInPackage: 'Sockets' ] Object subclass: Server [ | serverSocket clients accept | "Kiírja a paraméterül kapott üzenetet a standard kimenetre, a végén új sorral." print: message [ message printNl ] "Elindítja a szervert." start [ | line | self print: 'Server starting...'. "Az accept változó tárolja, hogy akarunk-e kapcsolatokat fogadni. Létrehozunk egy listenert a 8000-es porton. A klienseket egy asszociatív tömbben tároljuk." accept := true. serverSocket := (Sockets.ServerSocket port: 8000). clients := Dictionary new. "Elindítjuk a kapcsolatok fogadását." self acceptConnections; print: 'Listening on port 8000. Press enter to exit.'. "Ha bevitelt kapunk a standard bemenetről, leállítjuk a kapcsolatokat." line := stdin nextLine. accept := false. ] "Külön szálon fogadja a kapcsolatokat a kliensektől." acceptConnections [ [ | i | "Ez lesz a folyamatok azonosítója. Az asszociatív tömb miatt ez tetszőleges típusra felcserélhető." i := 1. [ accept ] whileTrue: [ "Addig fogadunk új kapcsolatokat, amíg a változó át nincs állítva." | client | [ serverSocket waitForConnection. "Várunk egy csatlakozó klienst." client := (serverSocket accept). "Elfogadjuk a csatlakozást, a létrejövő Socket objektumot pedig eltároljuk." clients at: i put: client. "Hozzáadjuk az új Socketet a kliensek tömbjéhez." i := i + 1. "A következő kliens már eggyel nagyobb azonosítót kap." ["Külön szálon fogadjuk az üzeneteket minden klienstől." | id msg | id := i - 1. "Beállítjuk a folyamat azonosítóját." [ accept & msg ~= '|CONNECTION_CLOSED|' ] whileTrue: [ "Addig fogadunk üzeneteket, amíg a változó át nincs állítva, vagy amíg |CONNECTION_CLOSED| üzenetet nem kapunk." client isOpen ifTrue: [ msg := (client nextLine). "Ha a kapcsolat még él, fogadunk egy üzenetet." ]. clients do: [ :dest | "Minden kliensnek elküldjük a fogadott üzentet." dest isOpen ifTrue: [ msg displayOn: dest. (String with: (Character value: 10)) displayOn: dest. dest flush ] ] ]. clients removeKey: id. "Ha már nem fogadunk, töröljük a klienst." ] fork ] on: SystemExceptions.FileError "Akkor lép fel kivétel, ha le akarjuk állítani a szervert, és még van nyitott kapcsolat." do: [:ex | self print: 'Server stopped.' ]. ] ] fork ] ] "Elindítjuk a szervert." Eval [ server := Server new. server start ]