λ€νΈμν¬νλ‘κ·Έλλ° ν νλ‘μ νΈ β TCP κΈ°λ° λ©ν°νλ μ΄ λ£¨λ―ΈνλΈ κ²μ Java Socket + Swing UIλ‘ κ΅¬νν 4μΈ λ©ν°νλ μ΄ λ£¨λ―ΈνλΈμ λλ€.
μλ²κ° λͺ¨λ κ²μ κ·μΉκ³Ό μ μλ₯Ό κ΄λ¦¬νκ³ , ν΄λΌμ΄μΈνΈλ UI/μ λ ₯/νμλ§ λ΄λΉνλ ꡬ쑰μ λλ€.
- ν
μ€νΈ κΈ°λ° νλ‘ν μ½ μ μ (
TYPE|payloadνμ) - νμΌ λͺ¨λΈ (
μμ,μ«μ,쑰컀 μ¬λΆ) - λ©μμ§ / μ²λ¦¬ κ²°κ³Ό κ³΅ν΅ κ΅¬μ‘°
- μ¬λ¬ ν΄λΌμ΄μΈνΈ λμ μ μ κ΄λ¦¬ (μ€λ λ κΈ°λ°
ClientSession) - λ°©(Room) μμ± / μ μ₯ / ν΄μ₯ / λ°©μ₯ κ΄λ¦¬
- 루미νλΈ λ£° μμ§ (
GameCore)- SET / RUN λ©λ κ²μ¦
- Joker(쑰컀) κ° μΆλ‘ λ° κ³ μ (
RJoker(5)νν) - μ΄κΈ° 30μ κ·μΉ κ²μ¦
- λ©λ μ¬μ‘°ν© ν λ¨μ μ‘°κ°κΉμ§ μ ν¨νμ§ κ²μ¬
- λ©λ μ¬λ°°μΉ μκ³ λ¦¬μ¦ (
MeldRearranger) - μ μ μμ€ν
- λΌμ΄λ μ’ λ£ μ μν¨ μ μ ν©μ°
- μΉμλ λ€λ₯Έ νλ μ΄μ΄ μ μ ν©λ§νΌ +
- ν¨μλ μμ μ μν¨ μ μλ§νΌ β
SCORE|name|scoreλΈλ‘λμΊμ€νΈ
- λ‘κ·ΈμΈ νλ©΄ (μλ² μ£Όμ/ν¬νΈ/λλ€μ μ λ ₯)
- λ‘λΉ νλ©΄
- λ°© λͺ©λ‘ μ‘°ν (
LIST) - λ°© μμ± (
CREATE) - λ°© μ
μ₯ (
JOIN)
- λ°© λͺ©λ‘ μ‘°ν (
- κ²μλ£Έ νλ©΄
- ν
μ΄λΈ 보λ (
BoardPanel) β μλ² λ³΄λλ₯Ό κ·Έλλ‘ κ·Έλ¦Ό - μν¨ ν¨λ (
TwoRowHandPanel) β 2μ€ μν¨ + μ λ ¬(μμ/μ«μ) - λλκ·Έ&λλ‘μΌλ‘ λ©λ κ΅¬μ± / μ¬μ‘°ν©
- κ·μΉ μλ° μ ν΄ λ΄μ λΈ νμΌλ§ λ‘€λ°±
- νμ¬ ν΄ / λ΄ μ μ λΌλ²¨ νμ
- μΉλ¦¬/ν¨λ°° + μ μ νμ νμ
- ν
μ΄λΈ 보λ (
NetWorkProgramming/
ββ rummikub/
ββ rummikub-server/
β ββ src/
β ββ common/
β β ββ Message.java // κ³΅ν΅ λ©μμ§ κ΅¬μ‘°
β β ββ Protocol.java // νλ‘ν μ½ μμ μ μ
β β ββ Result.java // μ²λ¦¬ κ²°κ³Ό νν
β β ββ Tile.java // νμΌ λ°μ΄ν° λͺ¨λΈ
β β
β ββ server/
β ββ ServerMain.java // μλ² μ€ν μ§μ
μ (main)
β ββ GameServer.java // ServerSocket, ClientSession κ΄λ¦¬
β ββ ClientSession.java // ν΄λΌμ΄μΈνΈλ³ μΈμ
μ€λ λ
β ββ Room.java // λ°©(λ£Έ) κ΄λ¦¬, ν΄/PLAY/NO_TILE μ²λ¦¬
β ββ GameCore.java // κ²μ κ·μΉ, λ©λ/쑰컀 κ²μ¦, μ μ κ³μ°
β ββ MeldRearranger.java// μλ² μΈ‘ λ©λ μ¬μ‘°ν© μκ³ λ¦¬μ¦
β
ββ rummikub-client/
β ββ src/
β ββ client/
β β ββ ClientMain.java // ν΄λΌμ΄μΈνΈ μ€ν μ§μ
μ
β β ββ ClientApp.java // μ 체 μ± λ‘μ§, νλ©΄ μ ν, λ©μμ§ νΈλ€λ¬
β β ββ NetIO.java // μμΌ μ°κ²°, send()/μμ μ€λ λ
β β ββ LoginView.java // λ‘κ·ΈμΈ νλ©΄
β β ββ LobbyView.java // λ‘λΉ(λ°© λͺ©λ‘/μμ±/μ
μ₯)
β β ββ RoomView.java // κ²μ νλ©΄(보λ, μν¨, μ±ν
, μ μ, νμ
)
β β ββ BoardPanel.java // ν
μ΄λΈ 보λ UI, λ©λ/νμΌ λ°°μΉΒ·μ¬μ‘°ν©
β β ββ TwoRowHandPanel.java // μν¨ 2μ€ νμ λ° μ λ ¬
β β ββ TileView.java // κ°λ³ νμΌ UI, λλκ·Έ/쑰컀 νμ
β β
β ββ assets/
β ββ images/
β ββ login_bg.png
β ββ R1.png, R2.png, ...
β ββ BL1.png, ...
β ββ RJoker.png
β ββ BJoker.png
β
ββ (docs, README λ±)
- μΈμ΄: Java
- UI: Swing + FlatLaf (λͺ¨λ 룩μ€ν)
- λ€νΈμν¬: TCP Socket, ν μ€νΈ κΈ°λ° νλ‘ν μ½
- ꡬ쑰
- κ³΅ν΅ λͺ¨λ(common) + μλ²(server) + ν΄λΌμ΄μΈνΈ(client) 3κ³μΈ΅
- μλ² authoritative (λͺ¨λ λ£°/μ μλ μλ²μμλ§ κ²°μ )
- Eclipse μ€ν
- File > Import > General > Existing Projects into Workspace
- μμΆ ν΄μ ν νλ‘μ νΈ ν΄λ μ ν ν Finish
β» μλ²λ₯Ό λ¨Όμ μ€νν ν ν΄λΌμ΄μΈνΈλ₯Ό μ€νν©λλ€. β» Java 21 μ΄μ νκ²½μμ μ€ν κ°λ₯ν©λλ€.
- κΈ°λ³Έ ν¬νΈ(μ: 5000)λ‘ μλ²κ° μ΄λ¦Ό λλ ν°λ―Έλμμ (μμ)
- rummikub-server > src/server/ServerMain.java
- μ°ν΄λ¦ > Run As > Java Application
cd rummikub-server/src
javac common/*.java server/*.java
java server.ServerMain
-
rummikub-client > src/client/ClientMain.java
-
μ°ν΄λ¦ > Run As > Java Application
-
λ‘κ·ΈμΈ νλ©΄μμ
- νΈμ€νΈ: localhost
- ν¬νΈ: 5000
- μ΄λ¦: μνλ λλ€μ ν΄λΌμ΄μΈνΈλ₯Ό μ¬λ¬ κ° μ€ννλ©΄ ν PCμμ λ€μ€ μ μ ν μ€νΈ κ°λ₯.