From c86d303d5b33ce58f64e065359d25b5aee5b85be Mon Sep 17 00:00:00 2001 From: David Alves Date: Mon, 13 Oct 2025 20:40:33 +0100 Subject: [PATCH] =?UTF-8?q?Cria=C3=A7=C3=A3o=20de=20classes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/src/main/java/sd/CruzamentoServer.java | 34 +++++++++++++ main/src/main/java/sd/Semaforo.java | 47 ++++++++++++++++++ main/src/main/java/sd/Veiculo.java | 35 +++++++++++++ main/target/classes/sd/CruzamentoServer.class | Bin 0 -> 792 bytes main/target/classes/sd/Semaforo.class | Bin 0 -> 1591 bytes main/target/classes/sd/Veiculo.class | Bin 0 -> 1648 bytes 6 files changed, 116 insertions(+) create mode 100644 main/src/main/java/sd/CruzamentoServer.java create mode 100644 main/src/main/java/sd/Semaforo.java create mode 100644 main/src/main/java/sd/Veiculo.java create mode 100644 main/target/classes/sd/CruzamentoServer.class create mode 100644 main/target/classes/sd/Semaforo.class create mode 100644 main/target/classes/sd/Veiculo.class diff --git a/main/src/main/java/sd/CruzamentoServer.java b/main/src/main/java/sd/CruzamentoServer.java new file mode 100644 index 0000000..1d84a00 --- /dev/null +++ b/main/src/main/java/sd/CruzamentoServer.java @@ -0,0 +1,34 @@ +package sd; + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; + +public class CruzamentoServer { + public static void main(String[] args) { + // ... Inicializa Semáforos (Threads) ... + // ... Inicializa as Estruturas de Dados ... + + try (ServerSocket serverSocket = new ServerSocket(portaDoCruzamento)) { + while (true) { + Socket clienteSocket = serverSocket.accept(); + // Cria uma Thread de atendimento para lidar com o Veículo/Cliente + new Thread(new AtendenteVeiculo(clienteSocket)).start(); + } + } catch (IOException e) { /* ... */ } + } + + // Método chamado pelo AtendenteVeiculo para gerenciar o tráfego + public synchronized boolean tentarPassar(Veiculo veiculo, String direcao) { + // 1. Veículo entra na fila da direção + // 2. Verifica o estado do semáforo da direção: + Semaforo semaforo = getSemaforo(direcao); + semaforo.esperarPeloVerde(); // O Veículo fica bloqueado se for vermelho + + // 3. Após o verde: + // - Remove da fila + // - Permite a passagem (envia resposta de volta ao Veículo cliente) + // 4. Envia estatística de passagem ao Simulador Principal (Cliente TCP) + return true; + } +} diff --git a/main/src/main/java/sd/Semaforo.java b/main/src/main/java/sd/Semaforo.java new file mode 100644 index 0000000..8f1d8ad --- /dev/null +++ b/main/src/main/java/sd/Semaforo.java @@ -0,0 +1,47 @@ +package sd; + +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; + +public class Semaforo extends Thread { + // ... atributos ... + private final Lock semaforoLock; // Para sincronizar acesso ao estado + private final Condition verdeCondition; // Para Veículos esperarem pelo verde + + public Semaforo(...) { + this.semaforoLock = new ReentrantLock(); + this.verdeCondition = semaforoLock.newCondition(); + } + + @Override + public void run() { + while (true) { + // Ciclo de tempo (ajustável para controle) + estado = Estado.VERMELHO; + // Notificar o Cruzamento sobre o estado + try { + Thread.sleep(tempoVermelho); + estado = Estado.VERDE; + // Ao ficar VERDE, notifica as threads Veículo que estão esperando + semaforoLock.lock(); + try { + verdeCondition.signalAll(); + } finally { + semaforoLock.unlock(); + } + Thread.sleep(tempoVerde); + } catch (InterruptedException e) { /* ... */ } + } + } + // Método para a thread Veículo esperar + public void esperarPeloVerde() throws InterruptedException { + semaforoLock.lock(); + try { + if (estado == Estado.VERMELHO) { + verdeCondition.await(); + } + } finally { + semaforoLock.unlock(); + } + } +} \ No newline at end of file diff --git a/main/src/main/java/sd/Veiculo.java b/main/src/main/java/sd/Veiculo.java new file mode 100644 index 0000000..2a55ec9 --- /dev/null +++ b/main/src/main/java/sd/Veiculo.java @@ -0,0 +1,35 @@ +package sd; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.net.Socket; + +public class Veiculo implements Runnable { + // ... + private String proximoCruzamentoIP; + private int proximoCruzamentoPorta; + + public void run() { + // Simular o movimento na rua (Thread.sleep(t)) + + // 1. Tenta se conectar ao próximo Cruzamento + try (Socket socket = new Socket(proximoCruzamentoIP, proximoCruzamentoPorta); + ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); + ObjectInputStream in = new ObjectInputStream(socket.getInputStream())) { + + // Envia o objeto Veículo com a solicitação de passagem + out.writeObject(this); + + // 2. BLOQUEIA a Thread, esperando a resposta do Servidor/Cruzamento + String permissao = (String) in.readObject(); + + if ("OK_PASSAR".equals(permissao)) { + // Simular tempo de travessia do cruzamento (pequeno Thread.sleep()) + // Atualiza a rota (próximo nó) + } + + } catch (IOException | ClassNotFoundException e) { /* ... */ } + // ... continua o loop da rota até a Saída (S) ... + } +} diff --git a/main/target/classes/sd/CruzamentoServer.class b/main/target/classes/sd/CruzamentoServer.class new file mode 100644 index 0000000000000000000000000000000000000000..f1925fd16c31698188474663711a02028dc17e6d GIT binary patch literal 792 zcmaJNMXfB)xAfW=M2#``D0Vij7nz-7vBd<3S-1$MA zDuD!deiUMyM5IE2%Z%soee>}A{Pp!afG2oRLq*`ANc*R*{G@U+-j2vE$kk94XkDm< z>SxMK`>!V#lz4%?$J%KBRA49WjRmTwHl+wVXf&~lJ%Rn9HuS2@C*;o5BqM?L&?YJy zE2o3Kc2@mN7XqE(meK>J&6PF+hw+EuriGDr+Dr$%aSb=Q&?fN0IqT{;5cvGoI4W$m zpj0L{pX*F{ZH=5e%eC|3k&GI1>%4kyHv`K=8DqViko*JoRw}tz_Z&5zc`_+4hsLCn zGPD1L_>XgnBDBy6`#9tY<82cNG?~#W_eK?kasu5rY+}tm*aCT9$6bN!|MP|M&SoTY z@-v&tDftoQ>fAaTua?)7x{xK0a?Zb$N{&d+`JrpMS;*=FB7taROPA0~9saTNcfv{d z0d&E)z{doZBHRGW8e4tVg7xn4CF)=JQ9;Bqguw~dSTO66!>S>WE1{r+!C)Wp>Q literal 0 HcmV?d00001 diff --git a/main/target/classes/sd/Semaforo.class b/main/target/classes/sd/Semaforo.class new file mode 100644 index 0000000000000000000000000000000000000000..e275fc3388cd780d2a0d27a66cfeb9f7181c14c6 GIT binary patch literal 1591 zcmdT^O>Yx15FIBWAKRoUq2-&_2@(oYmA!DHz=0}AND)FxiNw*}9U9YJdu4m0a^QC% zfdqGc6k@y$X^~QtLlNTQwLR}Wk7wWb`;X6G0pKb0YEWXZX5(;-sd%T2u0e&t#(Oan zVItH~crZ06Vg^k+2aI%d%%D3eAi0xC7-<#d#-MUxLO~mP$R30B8JZaPwTh*aS}}O= zC(;5(%<2=VqP}$cp)}Y0peU{kJ7;Wm%W~KTYWzgzmhB1$Hn#n}?^LS?T zVS=fB%!9`GgL2}8qbG5SIemornn_l+unLB41pBXoAm#k%ICM8pBnAB%SFAniP}i zD#Cv+gBVx1*QFmHKohPup#dERTm4hB6($}#Bh}HK_fmT#6~4;TLo^4zybL;ISCLHS z<(_X=ycrm@M(0|Cj9E6hs>3bD?yumvOTS;^|N6o7j-buZ2=f{f@5`8~9Slz*%zS^^ z8r);Beb&)0m81U5Gl%g4REHe~?q3v}QXT8uMEF8_m$ZI8kOQAEbb-u3PiP4`a0RL~ z>p%_a^et1Q0RfF`w0cym0fH~keA`+71RLK9)-@WdgaJZr(%3BK0c^o_S~0kBfx^ut g3Y$w6Zj(X@?vPrA^zJUnW_yWNf2kHHl@fG+0tHReApigX literal 0 HcmV?d00001 diff --git a/main/target/classes/sd/Veiculo.class b/main/target/classes/sd/Veiculo.class new file mode 100644 index 0000000000000000000000000000000000000000..3414695d80379293bc7ce3bfe3bcb6d565323d1e GIT binary patch literal 1648 zcmZux-%}e^6#gzG*(6o;%}&8JQ8EaK=&ppgvf?yGh8>lFjbjd(U^zch0%r*}wk#?RNlo@U?f3St7O-s-k*S^8ex5EyPc_EWQAuR8t@dc&|h zySPQD*29)P$F%mB1x8v0k{c0k`Y(>EvL5Ov5v<|)ie z=DZB=EV?ixTan?tqvBn>CvfSBV|qqg90KWZnc9oX5Harcg>t#Dox~#Us93>WD#rNE*Xum&3)vq^_JWE}q;8SYG){B;s#)s(2FM`snNOSJwB5UqMd&cbNv5qn`o5Z(ha2&yp_=#f# zEnf2XH?RAhaf8K{Rl5-sdWh&0cMj9bC>D@mON`Oq1pXmHR&;^YWYszq9l_5iVT(Q{ zaeyzdO_q7wBL5C?EA;s#?-(lFQ^e2<8e$5Bg0