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

  1. 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.

Exercício 01