Cliente-Servidor
De Aulas
Links relacionados: Programação Paralela e Distribuída
Servidor
1import java.io.*;
2import java.net.*;
3import java.util.Date;
4
5public class MyServer extends Thread {
6 private ServerSocket sock;
7
8 public MyServer(int port) {
9 super();
10 try {
11 sock = new ServerSocket(port);
12 System.out.println("MyServer running at port " + port);
13 } catch (IOException e) {
14 System.out.println("Error: couldn't create socket.");
15 System.exit(1);
16 }
17 }
18
19 public void run() {
20 Socket client = null;
21
22 while (true) {
23 if (sock == null)
24 return;
25 try {
26 client = sock.accept();
27 // Recebendo identificacao
28 BufferedReader in = new BufferedReader(new InputStreamReader(
29 client.getInputStream()));
30 String c = in.readLine();
31 System.out.println(c);
32 // Enviando Informacoes
33 BufferedOutputStream bos = new BufferedOutputStream(client
34 .getOutputStream());
35 PrintWriter os = new PrintWriter(bos, false);
36
37 Date now = new Date();
38 os.println("return of '" + c + "'");
39 os.flush();
40 os.close();
41 client.close();
42 } catch (IOException e) {
43 System.out.println("Error: couldn't connect to client.");
44 System.exit(1);
45 }
46 }
47 }
48
49 public static void main(String[] arguments) {
50 int port = 4000;
51 if (arguments.length == 1) {
52 port = Integer.parseInt(arguments[0]);
53 }
54 MyServer server = new MyServer(port);
55 server.start();
56 }
57}
Cliente
A classe MyClient é um programa que se conecta à um servidor, envia uma mensagem e recebe um retorno. Para chamar o programa, é necessário passar por parâmetro o nome ou ip do servidor, a porta e a mensagem que se quer enviar.
1import java.io.*;
2import java.net.*;
3
4public class MyClient {
5 public static void main(String[] arguments) {
6 String mesg;
7 String host;
8 String port;
9 if (arguments.length == 3) {
10 host = arguments[0];
11 port = arguments[1];
12 mesg = arguments[2];
13 } else {
14 System.out.println("Usage: java MyClient host port message");
15 return;
16 }
17 try {
18 Socket digit = new Socket(host, Integer.parseInt(port));
19 digit.setSoTimeout(20000);
20
21 // Envia identificacao
22 BufferedOutputStream bos = new BufferedOutputStream(digit
23 .getOutputStream());
24 PrintWriter os = new PrintWriter(bos, false);
25 os.println(mesg);
26 os.flush();
27
28 // recebe informacoes
29 BufferedReader in = new BufferedReader(new InputStreamReader(digit
30 .getInputStream()));
31 boolean eof = false;
32 while (!eof) {
33 String line = in.readLine();
34 if (line != null)
35 System.out.println(line);
36 else
37 eof = true;
38 }
39 digit.close();
40 } catch (IOException e) {
41 System.out.println("IO Error: " + e.getMessage());
42 }
43 }
44}
Exemplo de utilização:
$ java MyClient 192.168.0.1 4000 "45 * 34"
TesteTok
1import java.util.StringTokenizer;
2
3public class TesteTok {
4 public static void main(String [] args) {
5 String teste = args[0];
6 StringTokenizer st = new StringTokenizer(teste);
7
8 int a = Integer.parseInt(st.nextToken());
9 String op = st.nextToken();
10 int b = Integer.parseInt(st.nextToken());
11 int c = 0;
12
13 if (op.compareTo("+") == 0) {
14 c = a + b;
15 } else if (op.compareTo("-") == 0) {
16 c = a - b;
17 }
18 System.out.println(teste + " = " + c);
19 }
20}
Utilização:
$ java TesteTok "54 + 32"
Exercícios
- A classe MyClient é um programa. Transforme essa classe em uma classe que possa ser reutilizável. Ela deve ter no mínimo três métodos: um método construtor, para configurar e abrir uma conexão com um servidor; um método send que envia uma string e recebe uma string; e um método close, para fechar a conexão.