Socket Basico

Na empresa a qual trabalho tem um servidor nosso que roda java applet ele tem uma pasta Client onde as classes devem ficar e uma pasta Public onde o html e a class applet devem ficar.

Ateh ai tudo bem porém, eu preciso criar um socket para comunicar com o servidor e o usuario para enviar as mensagens nao sei porque nenhum exemplo que eu ja peguei deram certo.

Gostaria da ajuda de vcs. Nesse servidor ja venho um código teste o qual faz a conexao apenas uma vez e depois que eu saiu e volto nao funciona mais :frowning: vou posta o exemplo.


import OAJUtil.*;
import java.io.*;
import java.net.*;
public class Client implements JatConstants
{
   static ServerSocket serverSocket = null;
   static Socket clientSocket = null;
   public static PrintWriter out = null;

   class ipClient extends Thread
   {
      private static final int MAXRCVLENGTH = 512;
      BufferedReader in = null;

      private String parseString(String rcvbuf, int offset)
      {
         String retval = "";
         int i = offset;
         while ((rcvbuf.charAt(i) != '<') && (i < rcvbuf.length())) {
            retval += rcvbuf.charAt(i++);
         }
         return retval;
      }

      public void run()
      {
         try {

            try {
               serverSocket = new ServerSocket(12666);
            } catch (IOException ioe) {
               JatLog.writePermLog("Could not listen on port: 12666. " + ioe);
               System.exit(1);
            }

            try {
               clientSocket = serverSocket.accept();
            } catch (IOException ioe) {
               JatLog.writePermLog("Accept failed. " + ioe);
               System.exit(1);
            }

            try {
               out = new PrintWriter(clientSocket.getOutputStream(), true);
               in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            } catch (IOException ioe) {
               JatLog.writePermLog("Init IP failed" + ioe);
            }

            String receive = "", type = "", value = "";
            short id;
            JatMessage message = null;
            while (true) {
               id = 0;
               type = "";
               value = "";
               if (in.readLine().startsWith("<MSG>")) {
                  do {
                     receive = in.readLine();
                     if (receive.startsWith("<TYPE>")) {
                        type = parseString(receive, 6);
                        if (type.equalsIgnoreCase("message")) {
                           JatLog.writeTempLog("Message created");
                           message = new JatMessage(USER_RESPONSE_NONE);
                           message.setCompletion();
                        }
                     } else if (receive.startsWith("<HDR>")) {
                        value = parseString(receive, 5);
                        if (type.equalsIgnoreCase("message")) {
                           JatLog.writeTempLog("Setting header: " + value);
                           message.setSubject(value);
                        }
                     } else if (receive.startsWith("<BODY>")) {
                        value = parseString(receive, 6);
                        if (type.equalsIgnoreCase("message")) {
                           JatLog.writeTempLog("Setting body: " + value);
                           message.setBody(value);
                        }
                     } else if (receive.startsWith("<DEST>")) {
                        value = parseString(receive, 6);
                        if (type.equalsIgnoreCase("message")) {
                           JatLog.writeTempLog("Setting destination: " + value);
                           message.setCallNumber(value);
                        }
                     } else if (receive.startsWith("<ID>")) {
                        value = parseString(receive, 4);
                        if (type.equalsIgnoreCase("message")) {
                           id = Short.valueOf(value).shortValue();
                        }
                     } else if (receive.startsWith("</MSG>")) {
                        JatLog.writeTempLog("Message creation finished");
                        if (type.equalsIgnoreCase("message")) {
                           JatLog.writeTempLog("Sent message with id: " + message.send(id) + " from Java, refID: " + message.getRefID() );
                        }
                     } else {
                        JatLog.writeTempLog("ipClient received: " + receive);
                     }

                  } while ( !receive.startsWith("</MSG>") );
               }
            }
         } catch (Exception e) {
            JatLog.writePermLog("Error initiating IP communication: " + e);
         }
         try {
            in.close();
            out.close();
            clientSocket.close();
            serverSocket.close();
         } catch (IOException ioe) {
            JatLog.writePermLog("closeIP failed " + ioe);
         }
         return;    
      }
   }

   public static void main(String args[])
   {
      Client cli  = new Client();
      ipClient itst = cli.new ipClient();
      JatSystem tester;
      try{
         tester = JatSystem.createJatSystem("3.00");
      } catch (Exception e)
      {
         JatLog.writeTempLog(e.getMessage());
         return;
      }
      try{
         MyJatMessageHandler msgHandler = new MyJatMessageHandler();
         tester.addService(msgHandler);
      } catch (Exception e)
      {
         JatLog.writeTempLog("MessageHandler: " + e.getMessage());
      }
      try{
         MyJatMessageConfHandler msgConfHandler = new MyJatMessageConfHandler();
         tester.addService(msgConfHandler);
      } catch (Exception e)
      {
         JatLog.writeTempLog("MessageConfHandler: " + e.getMessage());
      }
      try{
         MyJatMessageConfRespHandler msgConfRespHandler = new MyJatMessageConfRespHandler();
         tester.addService(msgConfRespHandler);
      } catch (Exception e)
      {
         JatLog.writeTempLog("MessageConfRespHandler: " + e.getMessage());
      }
      try{
         MyJatIMHandler IMHandler = new MyJatIMHandler();
         tester.addService(IMHandler);
      } catch (Exception e)
      {
         JatLog.writeTempLog("IMHandler: " + e.getMessage());
      }
      try{
         MyJatIMRespHandler IMRespHandler = new MyJatIMRespHandler();
         tester.addService(IMRespHandler);
      } catch (Exception e)
      {
         JatLog.writeTempLog("IMRespHandler: " + e.getMessage());
      }
      try{
         tester.execute();                
      } catch (Exception e)
      {
         JatLog.writeTempLog("Start system: " + e.getMessage());
         return;
      }

      JatLog.writeTempLog("System ready.. waiting for event...");
      itst.start();
   }
}

Aqui possui o link com tudo que tenho sobre o servidor

dentro desta pasta possui uma parte de exemplos que tem um applet rodando soh que nao conecta 2 vezes

LINK

http://www.4shared.com/file/167359219/90696c85/OJS.html?

É simples, para o programa ficar escutando indefinidamente você tem que colocar a criação do server num loop, senão acontece isso mesmo, abre o socket, aceita a conexão, faz o que tem que fazer, fecha o socket e o programa termina.

Mas nesse exemplo o qual passei tem como vc dar uma ideia de como poderia fazer isso

Aqui tem um exemplo simples de Socket. Basta você adaptá-lo à sua necessidade:

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Servidor {

	public Servidor(int porta) throws IOException {
		ServerSocket serverSocket = new ServerSocket(porta);
		while (true) { // aceita conexões até o processo ser interrompido
			// e para cada conexão, cria uma Thread:
			new Thread(new ServidorThread(serverSocket.accept())).start();
		}
	}

	private class ServidorThread implements Runnable {

		private Socket socket;

		public ServidorThread(Socket socket) {
			this.socket = socket;
		}

		@Override
		public void run() {
			String enderecoRemoto = socket.getInetAddress().toString();
			Scanner entrada;
			PrintWriter saida;
			try {
				entrada = new Scanner(socket.getInputStream());
				saida = new PrintWriter(socket.getOutputStream(), true);
			} catch (IOException e) {
				e.printStackTrace();
				return;
			}
			while (entrada.hasNextLine()) {
				System.out.println("O cliente " + enderecoRemoto
						+ " me mandou a seguinte mensagem:");
				// lê a entrada
				String mensagem = entrada.nextLine();
				System.out.println('\t' + mensagem);
				// e responde
				saida.println("Você me mandou '" + mensagem + "' para mim.");
			}
		}

	}

	public static void main(String[] args) throws IOException {
		new Servidor(8989);
	}

}

Lembrando que aqui há somente o Servidor (pressupõe-se que o cliente seja um programa externo, como telnet ou nc).

Só uma dica, você não precisa colocar cada comando em um bloco try-catch, fica impossível ler o código-fonte. Abre um único bloco para todos os comandos, mesmo porque você não faz muita coisa além de imprimir a stack trace nos tratamentos. Você também não precisa indicar qual método gerou a exceção, o stack trace já tem essa informação.


Socket client = null;
ServerSocket server = new ServerSocket(5000);
while(true){

client = server.accept();

}

OBS Não coloquei os imports e não fiz o tratamento das exceções, então jogue na IDE e lançe ou trate as exceções.

OBS Se você for querer receber vários clientes cada cliente deverá ter uma Thread para ele.