Prova Final de Características das Linguagens de Programação – 2008 – 10 período – 1a questão: Desenvolva uma aplicação cliente em Java, para se conectar a um servidor multithread e com ele jogar uma partida do jogo de baralho denominado 21. O usuário visualizará as suas cartas, que foram enviadas pelo servidor, no vídeo e solicitará nova carta - “c\n” - ou desistirá de receber novas cartas - “f\n” – via teclado e assim sucessivamente até terminar o jogo. Supor que a inicialização do servidor se dá através do comando: > java ServidorJogo#21 5600 Observações: i) O servidor é completamente honesto, no sentido de que ele não toma conhecimento, para favorecer a sua jogada, das cartas que já foram obtidas pelo cliente. ii) número das cartas: ás de qualquer naipe –> 1; n de de qualquer naipe -> n; valete, dama e rei de copas de qualquer naipe -> 10. Inicialmente cada jogador (tanto o cliente como o servidor) recebem duas cartas. O objetivo do jogo é conseguir atingir um somatório de valores de cartas que mais se aproxime de 21 pontos. Tanto o servidor quanto o cliente podem comprar tantas cartas quanto quiserem. Aquele que mais se aproximar de 21 pontos ganha o jogo. 2a questão: Programe um servidor (echo server) em Java que simplesmente reproduza um texto a ele enviado por um cliente. O seu servidor deve implementar múltiplos threads, para evitar que um cliente faça um outro cliente esperar indefinidamente, caso o texto enviado por algum cliente seja muito extenso. Este serviço ficará disponível na porta 3000. 3a questão: No código do applet KeypadApp, abaixo, aponte os trechos do código em que foi usado o mecanismo de herança, identificando a classe, a subclasse e os métodos herdados da classe pela subclasse. import java.awt.*; public class KeyPadApp extends java.applet.Applet { public void init() { add ( new KeyPad( 16 ) ); resize(preferredSize()); } } class KeyPad extends Panel { KeyPad ( int n ) { int s = (int)Math.sqrt(n); setLayout( new GridLayout(s, s) ); for (int i=0; i<n; i++) add( new Button( Integer.toString(i) ) ); } public boolean action(Event e, Object arg) { System.out.println("Button "+arg+" pressed"); return true; } } 4a questão: No código do applet a seguir, assumindo o modelo de eventos do AWT 1.1 – delegation model – responda: Quais são as fontes de eventos (event sources)? Quais são os listeners (event handlers) ? Quais são os tipos de eventos que são tratados? Identifique os trechos de código em que: o é dito que a classe responsável pelo tratamento do evento implementa uma listener interface (ou herda de uma classe que implementa uma listener interface); o é registrada uma instância da classe tratadora de eventos como um listener referente a um ou mais componentes; o é realizada a implementação dos métodos constantes da listener interface; import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class KeyEventDemo extends Applet implements KeyListener, ActionListener { TextArea displayArea; TextField typingArea; String newline; public void init() { Button button = new Button("Clear"); button.addActionListener(this); typingArea = new TextField(20); typingArea.addKeyListener(this); displayArea = new TextArea(5, 20); displayArea.setEditable(false); setLayout(new BorderLayout()); add("Center", displayArea); add("North", typingArea); add("South", button); newline = System.getProperty("line.separator"); } public void keyTyped(KeyEvent e) { displayInfo(e, "KEY TYPED: "); } public void keyPressed(KeyEvent e) { displayInfo(e, "KEY PRESSED: "); } public void keyReleased(KeyEvent e) { displayInfo(e, "KEY RELEASED: "); } public void actionPerformed(ActionEvent e) { //Clear the text components. displayArea.setText(""); typingArea.setText(""); typingArea.requestFocus(); } protected void displayInfo(KeyEvent e, String s){ String charString, keyCodeString, modString, tmpString; char c = e.getKeyChar(); int keyCode = e.getKeyCode(); int modifiers = e.getModifiers(); if (Character.isISOControl(c)) { charString = "key character = (an unprintable control character)"; } else { charString = "key character = '" + c + "'"; } keyCodeString + + + = "key code = " + keyCode " (" KeyEvent.getKeyText(keyCode) ")"; modString = "modifiers = " + modifiers; tmpString = KeyEvent.getKeyModifiersText(modifiers); if (tmpString.length() > 0) { modString += " (" + tmpString + ")"; } else { modString += " (no modifiers)"; } displayArea.append(s + newline + " + charString + newline + " + keyCodeString + newline + " + modString + newline); } } " " "