Socket + thread

12 respostas
J

galera tou fazendo uns exercicios…ai soh com socket ja consegui fazer um chat e uma calculadora…so que na disciplina que eu pago tem q ter threads ai fiz um codigo meio louco se alguem pudesse indicar os erros e as minhas viagens.

12 Respostas

davidtiagoconceicao

Onde está o código?
Qual sua dúvida?
Qual erro está ocorrendo? Em que momento?

Poste os trechos mais significativos do código pra galera tentar ajudar.

J
import java.io.*;
/*import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
*/
import java.util.Scanner;

import javax.swing.JOptionPane;

import java.net.ServerSocket;
import java.net.Socket;



public class ServidorSocket
{

	static ObjectOutputStream saida;
	static ObjectInputStream entrada;
	static String message = "";
	static boolean ok = false;
	static String linha = "";
	static Socket connection;
	static int count = 1;

	public static void main(String args[])
	{
		try
		{
			////////////////////////iniciar servidor////////////////////////////////
			ServerSocket s = new ServerSocket(12345,10);

			System.out.println("\nservidor iniciado\n");

			while(true)
			{

				try
				{

			/////////////////////////esperar algum cliente///////////////////////////
					System.out.println("\nesperando pela conexao\n");
					connection = s.accept();
					System.out.println("\nservidor conectado\n");
           /////////////////////////conseguir streams///////////////////////////////

		   			//configurar fluxo de saida
		   			saida = new ObjectOutputStream(connection.getOutputStream());
		   			saida.flush();//esvazia o buffer de saida para enviar informacoes do cabeçalho

		   			//configurar fluxo de entrada
		   			entrada = new ObjectInputStream(connection.getInputStream());
		   			System.out.println("\nsaidas e entradas obtidas\n");

			/////////////////////////processar conexao////////////////////////////////////

            		message = "Conexao foi um sucesso";
					saida.writeObject(message);
					saida.flush();//esvazia a saida para o cliente
					System.out.println("SERVER>>> " + message + "\n");

					while(ok == false)
					{

						   message = (String) entrada.readObject();//le uma nova msg
						   System.out.println("CLIENTE>>> " + message + "\n");//exibe a msg

						   linha = JOptionPane.showInputDialog("diga algo servidor");
						   saida.writeObject(linha);
						   saida.flush();//esvazia a saida para o cliente
						   System.out.println("SERVER>>> " + linha + "\n");

						   if(linha.trim().equals("tchau"))
						   ok = true;

					}

			  }//fim do 2 try

               catch(ClassNotFoundException classNotFoundException)
			   {
			   		System.out.println("\n nenhum objeto foi recebido");
			   }

                System.out.println("PARTE 3");
				System.out.println("\n fechei o servidor pelo cliente normalmente");
				entrada.close();
				saida.close();
				connection.close();



			 }//fim do outro while

		 }//fim do 1 try

		catch(IOException e)
		{
			System.out.println("PARTE 4");
			System.out.println("erro na comunicacao(erro inicial)");
			e.printStackTrace();
		}

	}//fim main

}//fim classe
J

eu sei q nao esta comentado e talz mas axo q p quem eh acostumado deve dar p entender e qualquer coisa eu falo aqui…esse eh um chat simples…e ta funcionando…o problemas eh botar threads(que odeio) ai no meio…nao querendo ser chato e ja agradecendo qualquer ajuda…geralmente a galera so fala "bota td dentro do run() " mas fica muito dificil se alguem mandasse um exemplo de codigo…nao eh p copiar…de preferencia mechendo no meu…eh so p entender…ate msm pq meu objetivo nao eh um chat(e sim um banco com operacoes de sacar etc futuramente)

import java.io.*;
/*import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
*/
import java.util.Scanner;

import javax.swing.JOptionPane;

import java.net.ServerSocket;
import java.net.Socket;

import java.net.InetAddress;


public class ClienteSocket
{


static ObjectOutputStream saida;
static ObjectInputStream entrada;
static String message = "";
static String linha = "";
static boolean ok = false;

static int count = 1;

	public static void main(String args[])
	{

		System.out.println("estou no main");
		try
		{
			Socket s = new Socket(InetAddress.getByName("127.0.0.1"),12345);

			System.out.println("tentei acessar o endereco");

            try
            {

            	/////////////////configurar fluxo de saida////////////////////////
		   		saida = new ObjectOutputStream(s.getOutputStream());
		   		saida.flush();//esvazia o buffer de saida para enviar informacoes do cabeçalho

		   		//////////////////configurar fluxo de entrada/////////////////////
		   		entrada = new ObjectInputStream(s.getInputStream());
				System.out.println("\nsaidas e entradas obtidas\n");

				System.out.println("\nTeste1 conseguiu stream cliente\n");

				//////////////processar msgs mandadas pelo cliente/////////////////
				///////////////////////////////////////////////////////////////////
				////////////////////////////e//////////////////////////////////////
				///////////////////enviar msg ao servidor/////////////////////////////////
				while(ok == false)
				{

					message = (String) entrada.readObject();//le uma nova msg
					//displayMessage("\n" + message);//exibe a msg
					System.out.println("SERVER>>> " + message + "\n");

					if(message.trim().equals("tchau"))
					ok = true;


					linha = JOptionPane.showInputDialog("diga algo cliente");
					System.out.println("CLIENTE>>> " + linha + "\n");

					saida.writeObject(linha);
					saida.flush();//esvazia a saida para o cliente

					if(linha.trim().equals("tchau"))
					ok = true;

			    }

			}
			catch(ClassNotFoundException classNotFoundException)
			{
				System.out.println("\n nenhum objeto foi recebido");
			}



             /////////////////////////fechar conexao//////////////////////////////////
            System.out.println("\n fechei o servidor pelo servidor");
			entrada.close();
			saida.close();
			s.close();

		}
		catch(IOException e)
		{
			System.out.println("\nnao foi possivel conectar com o servidor\n");
		}

	}

}
davidtiagoconceicao

ok, e onde estão as threads?

Uma sugestão é fazer este seu while(true) dentro do método run() de uma thread e criar uma nova thread para cada conexão.

J

vc acha q isto esta certo??? ei cara valeu ai msm q vc nao saiba ou nao tenha tempo de olhar pq acaba
ficando muitos codigos pra olhar…tentei fazer o servidor com thread:

import java.io.*;
/*import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
*/
import java.util.Scanner;

import javax.swing.JOptionPane;

import java.net.ServerSocket;
import java.net.Socket;

public class ServidorThreadJader implements Runnable
{

	Socket s;
	ObjectOutputStream saida;
	ObjectInputStream entrada;
	String message = "";
	boolean ok = false;
	String linha = "";
	Socket connection;
	int count = 1;

	public ServidorThreadJader(Socket s)
	{

		this.s = s;
	}

	public void run()
	{

		try
		{

			try
			{


		    	/////////////////////////conseguir streams///////////////////////////////
				//configurar fluxo de saida
				saida = new ObjectOutputStream(connection.getOutputStream());
				saida.flush();//esvazia o buffer de saida para enviar informacoes do cabeçalho

				//configurar fluxo de entrada
				entrada = new ObjectInputStream(connection.getInputStream());
		   		System.out.println("\nsaidas e entradas obtidas\n");

				/////////////////////////processar conexao////////////////////////////////////
				message = "Conexao foi um sucesso";
				saida.writeObject(message);
				saida.flush();//esvazia a saida para o cliente
				System.out.println("SERVER>>> " + message + "\n");

				while(ok == false)
				{

					message = (String) entrada.readObject();//le uma nova msg
					System.out.println("CLIENTE>>> " + message + "\n");//exibe a msg

					linha = JOptionPane.showInputDialog("diga algo servidor");
					saida.writeObject(linha);
					saida.flush();//esvazia a saida para o cliente
					System.out.println("SERVER>>> " + linha + "\n");

					if(linha.trim().equals("tchau"))
					ok = true;

				}//fim while

			}//fim do 2 try
			catch(ClassNotFoundException classNotFoundException)
			{
				System.out.println("\n nenhum objeto foi recebido");
			}

			System.out.println("\n fechei o servidor pelo cliente normalmente");
			entrada.close();
			saida.close();
			connection.close();

		}//fim 1 try

		catch(IOException io)
		{
			System.out.println("erro na comunicacao(erro inicial)");
			io.printStackTrace();
		}
	}//fim de run


	public static void main(String args[])
	{

		try
		{
			ServerSocket s = new ServerSocket(12345,100);
			System.out.println("\niniciando servidor multithread");

			while(true)
			{
				Socket connection = s.accept();

				new Thread(new ServidorThreadJader(connection)).start();

			}


		}
		catch(IOException io)
		{
			System.out.println("\nerro na comunicacao");
			io.printStackTrace();
		}

	}//fim do main

}
davidtiagoconceicao

olha cara, não tenho como analisar teu código bem a fundo agora.
Mas acho que é isso ai mesmo.
Está ocorrendo algum erro na execução?!

J

blz cara ta tranquilo…rapaz aparece:

Exception in thread Thread-0 java.lang.NullPointerException

at ServidorThreadJader.run(ServidorThreadJader.java:44)

at java.lang.Thread.run(Thread.java:619)

no console do servidor…isso usando o mesmo codigo cliente la de cima…pq um cara me disse q se eu ajeitasse o servidor nao precisava ajeitar o cliente com o metodo run( ) essas coisas. mas sei lah

M

Bom, me parece que ->connection ==null!!Troque pelo objeto s!!

J

rapaz ja tentei e nao resolveu…aqueles dois primeiros codigos la de cima funcionam so q sem thread…axo q errei geral ao colocar thread se alguem sacar ai???e outra pergunta depois q eu deixar o servidor com thread eu preciso mecher no codigo do cliente ou o cliente jah eh considerado um thread diferente? valeu

J

mrsmylle vc tinha razao…eh pq eh tinha substituido connection por s no local errado…e eu tive q dividir o servidor em 2 classes…nem precisei mudar o cliente…valeu msm cara e desculpe a ignorancia.flw

Luiz_Aguiar

jader killer o título do tópico foi alterado, por favor não poste novamente tópicos com títulos cheios de caracteres não úteis como fez.

Obrigado, conto com sua compreensão.

J

soh tou com um problema agora…eu abri alguns consloes representando clientes…mas soh 1 consegue se comunicar com o servidor os outros ficam conectados mas nao recebem nem enviam msg

isso pode ta tbm ocorrendo pq eu tou usando esses pop ups de JOptionPane… eh pq originalmente usava nextLine() ai nao tava capturando o q digitava no console e mudei p next( ) seguindo alguns foruns e nao adiantou nd…se alguem souber disso tbm ajuda bastante pq qnd uma pop up dessa abre o programa para esperando uma resposta

Criado 22 de fevereiro de 2009
Ultima resposta 23 de fev. de 2009
Respostas 12
Participantes 4