Dúvida sobre threads

2 respostas
W

Pessoal, comecei a ler o livro do Kurose - Redes de Computadores e a Internet - e lá no final do capítulo dois ele disponibiliza um código de um web server simples conforme segue:

import <a href="http://java.io">java.io</a>.<em>;

import <a href="http://java.net">java.net</a>.</em>;

import java.util.*;

class WebServer {

public static void main(String argv[])throws Exception {

String requestMessageLine;

String fileName;

ServerSocket listenSocket = new ServerSocket (8082);

Socket connectionSocket = listenSocket.accept();

BufferedReader inFromClient = new BufferedReader (new InputStreamReader(connectionSocket.getInputStream()));

DataOutputStream outToClient = new DataOutputStream                         (connectionSocket.getOutputStream());

requestMessageLine = inFromClient.readLine();

StringTokenizer tokenizedLine = new StringTokenizer (requestMessageLine);
if (tokenizedLine.nextToken().equals(GET)) {

fileName = tokenizedLine.nextToken();

if (fileName.startsWith("/") == true)

fileName = fileName.substring(1);

File file = new File(fileName);

int numOfBytes = (int) file.length();

FileInputStream inFile = new FileInputStream (fileName);

byte[] fileInBytes = new byte[numOfBytes];

inFile.read(fileInBytes);

outToClient.writeBytes (HTTP/1.0 200 Document Follows

);

if (fileName.endsWith(.jpg))

outToClient.writeBytes(Content - Type:image/jpeg

);

if (fileName.endsWith(.gif))

outToClient.writeBytes("Content - Type:image/gif

");

outToClient.writeBytes("Content - Length: " + numOfBytes + "

“);

outToClient.writeBytes(”

");

outToClient.write(fileInBytes, 0, numOfBytes);

connectionSocket.close();

}

else System.out.println(Bad Request Message);
}

}

Desculpem a péssima identação. Aí ele pede que transformemos o mesmo código em um servidor multithread com um thread principal, no qual o servidor fica na escuta esperando novas requisições, e cada requisição que chega deve ser manipulada por um novo thread. utiliza versão 1.0 do HTTP. Alguém consegue me ajudar???

Márcio :?:

2 Respostas

Leandro

Cara… vc vai ter que pesquisar sobre Threads, num é nada fácil… dá uma olhada na API e procura uns exemplos no site da SUN.

Mas a respeito de Socket, já fiz algumas aplicações (com Threads) e posso te ajudar, aí embaixo tem meu e-mail e ICQ…

E já posso te adiantar uma coisa, mesmo com Thread, a aplicação não vai ficar “escutando” entrada/saída de informação o que a Thread vai fazer é ficar olhando num loop infinito se já tem essa informação, mas por ser uma Thread, isso roda a parte na memória, não consumindo processamento… acho que é isso… :smiley:

Precisando, estamos aí!! :smiley:

claudio

Cara, na verdade eh muito facil:

uma thread eh uma linha de excucao, quando vc cria uma thread e a starta, vc estara criando uma linha de execucao que podera rodar em “paralelo” a outras.

Bom, vc devera criar uma thread que sera seu servidor e uma thread
para cada cliente, seu codigo ficaria mais ou mesnos assim, eu compilei e testei, funcionou na boa:

import java.io.*;
import java.net.*;
import java.util.*;

public class WebServer extends Thread{


	public void run(){
		try{

			ServerSocket listenSocket = new ServerSocket (8082);

			while(true){

				new TrataCliente(listenSocket.accept()).start();

			}


		}catch(Exception e){
		   e.printStackTrace();
		   System.exit(-1);
		}

	}


	public static void main(String args[]){

		new WebServer().start();

	}


}

class TrataCliente extends Thread{

	Socket connectionSocket;

	TrataCliente(Socket soc){
		this.connectionSocket = soc;
	}

	public void run(){
    	try{

			String requestMessageLine;
			String fileName;

			BufferedReader inFromClient = new BufferedReader (new InputStreamReader(connectionSocket.getInputStream()));
			DataOutputStream outToClient = new DataOutputStream (connectionSocket.getOutputStream());

			requestMessageLine = inFromClient.readLine();
			StringTokenizer tokenizedLine = new StringTokenizer (requestMessageLine);

			if (tokenizedLine.nextToken().equals("GET")) {

				fileName = tokenizedLine.nextToken();

				if (fileName.startsWith("/") == true) fileName = fileName.substring(1);

				File file = new File(fileName);
				int numOfBytes = (int) file.length();
				FileInputStream inFile = new FileInputStream (fileName);
				byte[] fileInBytes = new byte[numOfBytes];
				inFile.read(fileInBytes);
				outToClient.writeBytes ("HTTP/1.0 200 Document Follows ");

				if (fileName.endsWith(".jpg")) outToClient.writeBytes("Content - Type:image/jpeg");

				if (fileName.endsWith(".gif")) outToClient.writeBytes("Content - Type:image/gif");

				outToClient.writeBytes("Content - Length: " + numOfBytes + "");
				outToClient.writeBytes("");
				outToClient.write(fileInBytes, 0, numOfBytes);

				connectionSocket.close();

				} else {
					System.out.println("Bad Request Message");
				}

       }catch(Exception e){
		   e.printStackTrace();
		   System.exit(-1);
	   }


	}

}

A sequencia logica:

  • no metodo main, crio um servidor e ponho ele para rodar;
  • no servidor, dentro do metodo run() um while (true) possibilita que o servidor sempre esteja disponivel;
  • durante o runtime o processamento eh parado no metodo accept esperando por um cliente, logo o sistema nao sai dessa linha ateh alguem acessar o website;
  • quando alguem acessa o site, o accept eh executado e cria uma thread TrataCliente e poe ela para rodar, em seguida volta a esperar clientes;
  • o TrataCliente recebe a requisicao, abre o arquivo, devolve para o cliente e fecha a conexao (a web eh stateless);
Criado 5 de abril de 2003
Ultima resposta 7 de abr. de 2003
Respostas 2
Participantes 3