ServerSocket as a thread

Hi, i have made a class, SockServ, which extends Thread, in this class i create a ServerSocket an then wait for connecting clients and create worker threads acordingly.
Now, when i want to close down everything, i start by going through all the worker threads and interrupt them which all goes fine but when i try to interrupt SockServ i dont get a interrupt exception.
Here is how i create the SockServ class:
SockServ scks= new SockServ();
Thread t = new Thread(sockServThreadGroup,scks);
t.start();
t.setName("SocketServ");And here is the run method of the SockServ class:
public void run()
      while(running)
        try
            Socket socket = servSock.accept();
            Thread t1 = new Thread(myThreadGroup,new SocketServerService(socket,s,tempTable),s);
        catch (InterruptedException e)
         System.out.println("SocketServer interrupted");
           running=false;
}Thank you.

Try explicitly closing the socket.In my ServSock class i create my worker threads too and assign them to a new thread group, but the ServSock class is a thread as well and it is assigned to a threadgroup as well. Could it have something to do wit that?
when i run this i get a nullpointer exception but activecount() is not 0
for (int i = 0; i < sockServThreadGroup.activeCount(); i++)
            System.out.println("active SocetServer Threads: "+sockServThreadGroup.activeCount());
           sockServListThreads.interrupt();

Similar Messages

  • How can I use a Selector in a thread safe way?

    Hello,
    I'm using a server socket with a java.nio.channels.Selector contemporarily by 3 different threads (this number may change in the future).
    From the javadoc: Selectors are themselves safe for use by multiple concurrent threads; their key sets, however, are not.
    Following this advise, I wrote code in this way:
             List keys = new LinkedList(); //private key list for each thread
             while (true) {
              keys.clear();
              synchronized(selector) {
                  int num = selector.select();
                  if (num == 0)
                   continue;
                  Set selectedKeys = selector.selectedKeys();
                  //I expected this code to produce disjoint key sets on each thread...
                  keys.addAll(selectedKeys);
                  selectedKeys.clear();
              Iterator it = keys.iterator();
              while (it.hasNext()) {
                  SelectionKey key = (SelectionKey) it.next();
                  if ((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) {
                   Socket s = serverSocket.accept();
                   SocketChannel sc = s.getChannel();
                   sc.configureBlocking( false );
                   sc.register( selector, SelectionKey.OP_READ );
                  } else if ((key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) {
    //.....Unfortunately synchronizing on the selector didn't have the effect I expected. When another thread select()s, it sees the same key list as the other thread that select()ed previously. When control arrives to serverSocket.accept(), one thread goes ahead and the other two catch an IllegalBlockingModeException.
    I'm not willing to handle this exception, the right thing to do is giving disjoint key sets to each thread. How can I achieve this goal?
    Thanks in advance

    A single thread won't be enough cause after reading data from the socket I do some processing on it that may take long.So despatch that processing to a separate thread.
    Most of this processing is I/O boundI/O bound on the socket? or something else? If it's I/O bound on the socket that's even more of a reason to use a single thread.
    Anyway I think I'll use a single thread with the selector, put incoming data in a queue and let other 2 or 3 threads read from it.Precisely. Ditto outbound data.
    Thanks for your replies. But I'm still curious: why is a selector thread safe if it can't be used with multiple threads because of it's semantics?It can, but there are synchronization issues to overcome (with Selector.wakeup()), and generally the cost of solving these is much higher than the cost of a single-threaded selector solution with worker threads for the application processing.

  • Server Socket Threading

    My program does a couple of things, one of the thing it does is it runs a ServerSocket in the background.
    The problem is that when I run the my Server class, I can't do anything else since the ServerSocket is stuck in an infinite loop waiting for a new request.
    See this:
    My Driver
        public static void main(String [] args) {
                new Server();
                new SomethingElse();
        }Server's snippet of code that establishes a connection between a client and server.
         while (true)
                      try
                            Socket clientSocket = serverSocket.accept();
                       catch (IOException e)
                            System.out.println("Could not accept requests.");
                            System.exit(-1);
                  }So I can never reach SomethingElse() in the driver since Server is stuck in an infinite loop.
    I have tried to implement the ServerSocket as a thread, but the serverSocket throws an IOException (which makes sense since a ServerSocket should not have multiple versions of itself running at a same time unless they are on separate ports).
    So how would take care of this?
    Edited by: sharpdust on Dec 5, 2008 1:12 PM

    How about something like this?
    public static void main(String [] args) {
                new Thread(new Server()).start();
                new SomethingElse();
    public class Server implements Runnable {
         public void run() {
              while (true)
                      try
                            Socket clientSocket = serverSocket.accept();
                       catch (IOException e)
                            System.out.println("Could not accept requests.");
                            System.exit(-1);
    }

  • Implementing sockets and threads in a jframe gui program

    Hi, I am trying to find a solution to a problem I am having designing my instant messenger application.
    I am creating listening sockets and threads for each client logged into the system. i want to know if there is a way to listen to other clients request from the main gui and then if another client tries to establish a connection with me for example, a thread is created for that client and then my chat gui opens automatically has soon has the other client sends his or hers first text message to me.
    I am relatively new at socket programming has I am currently studying along this area. I know how to create threads and sockets but I am having trouble finding out a solution to my problem. Here is the code that I have done so far for the listening method from my main gui, and the thread class of what I have done so far.
    listening socket:
         private void listeningSocket()
                ServerSocket serverSocket = null;
                boolean listening = true;
                try
                    //listen in port 4444;
                    serverSocket = new ServerSocket(4444);
                catch(IOException x)
                    JOptionPane.showMessageDialog(null, "cannot listen to port 4444", null, JOptionPane.ERROR_MESSAGE);
                while(listening)
                    client_thread w;
                    try
                       w = new client_thread(serverSocket.accept(), jTextArea1);
                       Thread t = new Thread(w);
                       t.start();
                    catch(IOException x)
                         JOptionPane.showMessageDialog(null, "error, cannot start new thread", null, JOptionPane.ERROR_MESSAGE);
            }thread class:
    import java.io.*;
    import java.net.*;
    import javax.swing.*;
    import java.sql.*;
    import java.awt.event.*;
    * @author jonathan
    public class client_thread extends Thread
         //define new socket object
        private Socket client_user = null;
        private JTextArea textArea;
        public client_thread(Socket client_user, JTextArea textArea)
            this.client_user = client_user;
            this.textArea = textArea;
        public void run()
            BufferedReader in = null;
            PrintWriter out = null;
            String error = "error has occured, messege was not sent";
            String messege = null;
             try
                //create input and output streams
                in = new BufferedReader(new InputStreamReader (client_user.getInputStream()));
                out = new PrintWriter(client_user.getOutputStream(), true);
                while(true)
                   //read messege sent by user
                   messege = in.readLine();
                    //display messege in textfield
                   out.println(messege);
                   textArea.append(messege);
            catch (IOException e)
                //error messege
                JOptionPane.showMessageDialog(null, error, null, JOptionPane.ERROR_MESSAGE);
    }

    Seems like all you need to do is create a new dialog for each socket that is established. Your current design looks like it will attempt to use the same textarea for all the sockets.
    I would say in your thread class do the following:
    MyConversationDialog dialog = new MyConversationDialog();
    while(true)
                   //read messege sent by user
                   messege = in.readLine();
                    //display messege in textfield
                   out.println(messege);
                   dialog.setVisible (true);
                   dialog.addMessage (message);
                }

  • TCP Reflector ServerSocket simply want close() !!!

    I have implemented a TCP Reflector which through a ServerSocket creates new threaded Sockets within a while(true) loop. This is attached to a JPanel within a JFrame.
    The class responsible for creating this is a TCPConnectionListener, implementing a TCP Monitor. For each of the new Sockets that gets created from the ServerSocket.accept() method a new Thread is launched with a monitoring Agent to capture all traffic.
    public class TCPConnectionListener implements TCPMonitor {
    while (true) {
          try {
            Socket clientSocket;
            if(! connectionStopped) {
              clientSocket = server.accept();
            else {
              clientSocket = null;
            if(clientSocket != null) {
              con = new TCPConnection(someJPanel,
                                      clientSocket, (TCPConnectionMonitor)this,
                                      this.address, this.port);
          catch (IOException e) {
            System.out.println("ClientSocket IOException..." + e.getMessage());
        public closeConnection() {
          connectionStopped = true;
          // tried various ServerSocket.close(); ServerSocket.setSoTimeout(1), etc...
    }This within the GUI is implemented in the simplest of ways:
    public CurrentJPanel extends JPanel {
       private TCPConnectionListener con;
       private JButton start, stop;
       CurrentJPanel() {
       start.addActionL.... {
       con = new TCPConnection(..);
       stop.addActionLis... {
        con.stopConnection();
    }The problem is that everytime I attempt to access TCPConnectionListener con that has been initialised and is running, I simply get a null pointer exception.
    The questions are two:
    How can I get to the object that instantiated the TCPConnectionListener?
    How can I close the TCP Reflector sitting behind ServerSocket and its childs at the click of a button?
    There are various elements to this (e.g. SwingWorker3 within the MouseListener that I haven't described here) which have been omitted for clarity.
    The complete source code, including the TCPConnectionListener is a small sourceforge project I have recently started. You might find it useful to get a full picture of the problem at:
    http://sourceforge.net/projects/jbrofuzz
    In all honesty, this is not an attempt to get more visits at the project but to simply solve the problem at hand. I have browsed quite a lot of documentation and have not managed to find a process for closing the ServerSocket in a clean way when a TCP reflector is in place.
    Thank you in advance

    And for completeness, here is the code to the above description:
    public class TCPConnectionListener extends Thread implements TCPConnectionMonitor  {
      public void run() {
        while(!connectionStopped) {
          try {
            Socket clientSocket = server.accept();
            con = new TCPConnection(mn.getMainWindow().getJBroFuzz(),
                                    clientSocket, (TCPConnectionMonitor)this,
                                    this.remoteAddress, this.remotePort);
          catch (Exception e) {
            connectionStopped = true;
            break;
        try {
          server.close();
        catch(Exception e) {
        finally {
          try {
            server.close();
          catch(Exception e) {
      public void stopConnection() {
          try {
            server.close();
          catch (Exception e) {
            connectionStopped = true;
    ...So from the GUI we have the call to this class:
    public class MainSniffingPanel
        extends JPanel {
    // The action listener for the start button
        startButton.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            worker = new SwingWorker() {
              public Object construct() {
                startButton.setEnabled(false);
                stopButton.setEnabled(true);
                getMainWindow().setTabFuzzingEnabled(false);
                getMainWindow().getMainMenuBar().setFuzzStartEnabled(false);
                setupNewConnectionListener();
                return "start-window-return";
              public void finished() {
            worker.start();
      private void setupNewConnectionListener() {
        reflector = new TCPConnectionListener(this, rh, rp, lh, lp);
        reflector.start();
        stopPressed = false;
    }

  • It's working, but is it a good or bad design?

    hiya
    I hope I�m not breaking any forum rules, but any help would be greatly appreciated.
    I haven�t really done any programming so far, so finally writing an app with more than few lines of code was something different. Anyways, I managed to write it, but truth be told, I have no idea whether my design choices ( I�m not sure if that�s the right term ) were somewhat good or completely off. Thus, if I don�t know what parts of program are designed badly ( and why they are considered bad), then I won�t know where to improve. So I�m hoping someone could point out ( at least the most obvious )design mistakes I made.
    It�s a simple �chat� server where several clients ( up to twenty ) can connect to the server and talk to each other. In essence:
    1.server creates new client thread for each newly accepted connection
    2.if one of these client threads receives some data from the client, then:
    3. this client thread creates new ControlThread object (and passes received data to it )
    4. ControlThread object in turn spawns a new thread
    5. Finally, this spawned thread will send data to all client apps.
    I must point out that I could handle some things better using collection classes. But ignoring that, I�m most interested in other design flaws I made. For example:
    a) how scalable is this server app?
    b) what would you�ve done differently ( in terms of basic program structure )? Perhaps creating ControlThread object each time data needs to be sent to other client apps is a bad idea
    c) etc
    package serverchat;
    import java.net.*;
    import java.io.*;
    public class Main {
        public static void main(String[] args) {
            Server.runAll();
    class Server{
        static int servPort = 1600;
        static ServerSocket servSock;
        static Thread controlThread;
        static ClientHandling[] clientClass=new ClientHandling[20];
        static int numClients = 0;
        static Socket clientSockets[] = new Socket[20];
        static void runAll(){
            initServer();
            handleClient();
        static void initServer(){
            try{
             servSock = new ServerSocket( servPort );  
             catch(Exception e){}
        static void handleClient(){
            try{
                while(true){
                  clientSockets[numClients]  = servSock.accept();
                  clientClass[numClients] = new ClientHandling(clientSockets[numClients]);
                  numClients ++;               
            catch(Exception e){
    /*Each time some clientHandling thread receives data from client,
    it creates new ControlThread thread. This thread then sends this data
    to all clients connected to this server*/
    class ControlThread implements Runnable{
        ClientHandling[] clientClass=new ClientHandling[20];
        int numClients;
        String message;
        Thread t;
        ControlThread(String message){
            this.message = message;
            this.numClients = Server.numClients;
            this.clientClass = Server.clientClass;
            t = new Thread(this);
            t.start();
        public void run(){
            System.out.println("ControlThread has started");
                   for(int i= 0; i < numClients; i++){
                       if( clientClass[i] !=null ){
                           tellClients(i);
        /* sends data to all the clients. It does this by calling contrToClient()
         on an object that received this data from the client*/
        void tellClients(int i){
               clientClass.contrToClient(message);
    class ClientHandling implements Runnable{
    Socket clientSocket;
    Thread t;
    String message;
    OutputStreamWriter clientWrite;
    InputStreamReader clientRead ;
    BufferedReader readBuf;
    BufferedWriter writeBuf;
    ClientHandling(Socket s){
    clientSocket = s;
    startThread();
    void startThread(){
    t = new Thread(this);
    t.start();
    public void run(){ 
    try{        
    clientRead = new InputStreamReader (
    clientSocket.getInputStream(), "utf-8");
    readBuf = new BufferedReader (clientRead);
    catch(Exception e){ 
    do{   
    try{
    clientSocket.setSoTimeout(1000);
    message = "";
    message = readBuf.readLine();
    if ( !message.equals("") ){
    informContrThread();
    System.out.println(message);
    catch(Exception e){
    }while ( !message.equals("Stop") );
    try{
    clientSocket.close();
    catch(Exception e){
    /*this is the actual method that gets called by ControlThread object and
    sends received data to all the client apps*/
    void contrToClient( String message){
    try{
    OutputStreamWriter clientWrite = new OutputStreamWriter (
    clientSocket.getOutputStream(), "utf-8");
    writeBuf = new BufferedWriter (clientWrite);
    catch(Exception e){
    try{
    writeBuf.write(message + System.getProperty("line.separator"));
    writeBuf.flush();
    catch(Exception e){   
    try{
    clientSocket.close(); /* I assume I should close the connection
    with client if write() throws an exception? */
    catch(Exception e1){}
    /*creates new ControlThread object, which in turn will
    make sure all client apps receive this data*/
    void informContrThread(){
    System.out.println("informing contrThread");
    new ControlThread(message);
    thank you                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

    1.server creates new client thread for each newly accepted connection Good. Make sure the server doesn't do any I/O in the accepting thread, including even construction of input and output streams.
    2.if one of these client threads receives some data from the client, then:
    3. this client thread creates new ControlThread object (and passes received data to it )Why? What does the Control thread do that the client thread can't do? Does the client thread really create a new Control thread per piece of received data? What's the purpose of the Control thread here?
    4. ControlThread object in turn spawns a new thread Again why?
    From your description you appear to be creating:
    (a) a thread per connection
    (b) a thread per piece of received data
    (c) another thread per (b)
    What you probably need for a chat server is an input thread and an output thread per connection. The output thread should read a queue and the input thread should write to the appropriate queue(s), making sure you don't create a loop by sending the client's own data back to him.
    5. Finally, this spawned thread will send data to all client apps.No. Use one output thread per connection, as described above. As writing to a socket can block, you shouldn't use a single thread for writes to more than one client, otherwise the whole system can stall due to one non-co-operating client.
    a) how scalable is this server app?It's about as non-scalable as it could possibly be. You will have an explosion of threads per item of data received if you've described it correctly, and you already have too many threads per connection.
    b) what would you�ve done differently ( in terms of basic program structure )?Almost everything: see above.
    Perhaps creating ControlThread object each time data needs to be sent to other client apps is a bad ideaMost definitely.

  • How can I connect many client in  one server ?

    Hello, My name is Fabio, i live in Brazil.
    I need that two or more conect the ane server socket.
    Who can help me ?

    Hello, My name is Fabio, i live in Brazil.
    I need that two or more conect the ane server
    socket.
    Who can help me ?Do you mean the common idiom?
    // server code
    while (true){
      Socket s = serverSocket.accept();
      new Thread(new ClientHandler(s)).start();
    class ClientHandler implements Runnable{
      Socket soc;
      public ClientHandler(Socket so){
        soc = so;
      public void run(){
        // do io using soc's io streams
    }

  • Feedback request for a Single Instance Application Implementation

    Hello,
    I have been working on a class which I tried to make the most generic I could so that I could re-use it for various projects. It offers 2 main functionalities:
    -Preventing multiple instances of an application
    -Allowing a user to stop the application even if it doesn't read any user input
    Of course if someone wants to have multiple instances of the same application, it is still possible. The only requirement is that each instance be configured to run on a different port.
    I would like your feedback on how I've implemented this to make sure I haven't missed the chance to make my Class flexible and re-usable. I would also make sure that there aren't any situations where the different threads used for realizing this functionality will run into any conflicts.
    My code includes the following files:
    Serviceable.java : An interface which must be implemented by every application using these classes
    DuplicateServiceException.java : An exception thrown when an instance of the application is already running
    Service.java : The class responsible for offering the functionalities I already mentionned
    Main.java : An example of a class implementing Serviceable and offering two ways of closing the Application. 1- By closing the JFrame which is displayed. 2- By sending the stop command.
    In order to execute this example, you have to specify the following command line arguments:
    -DService.Command={start/stop} //Either start or stop command
    -DService.Port=<0-65535> //Port to be used for receiving the stop command and preventing multiple instances
    Serviceable.java
    * Serviceable cares about two parts of the life of a Service.  Its startup
    * and its shutdown sequences.  The startup occurs only after making sure
    * no other instance of the Service is running.  Shutdown has to be
    * synchronized between multiple threads since it is possible to shutdown
    * the service through a shutdown command sent by another process, or through
    * the normal flow of execution of the service.
    * @author Gabriel Aubut-Lussier
    public interface Serviceable {
          * Initiates the startup of the Service since we have made sure
          * that there isn't any other instance of the Service running.
         public void startup();
          * Initiates the shutdown of the Service since we've received
          * a shutdown request from one of the two supported means of
          * shutting down.
         public void shutdown();
    DuplicateServiceException.java
    public class DuplicateServiceException extends Exception {
          * serialVersionUID?  Bah. Eclipse generates one automatically so why not...
         private static final long serialVersionUID = 3929576386522489749L;
         public DuplicateServiceException() {
              super();
         public DuplicateServiceException(String msg) {
              super(msg);
    Service.java
    * The same way a graphical application is running as long as there
    * is something to display, a background service will run as long as
    * there is an active Thread.
    * A service can be terminated in different ways.  First of all, it
    * can be terminated through its normal flow of execution.  On the
    * other hand, it is possible to provoke the termination of a Service
    * externally.
    * To terminate the service through the normal flow, just call the
    * Service.shutdown() method.  Another way to terminate the service
    * is to start a new instance of the program with the Stop command.
    * This Service implementation will behave according to two system
    * properties.  The property Service.Command can be set
    * to "start" or "stop".  When set to "start", the Service will make
    * sure there isn't another instance of the service already running.
    * If it is the case, a DuplicateServiceException will be thrown.  In
    * the other case, the Service will start.  When the "stop" command
    * is invoked, the Service will attempt to stop a running instance of
    * the Service.  The other property is Service.Port and
    * it defines the Port number which will be used to support the
    * functionalities offered by the Service class.
    * It is recommended to set these properties as command line arguments
    * when launching the application.  Moreover, batch files or shell
    * scripts can be created for invoking the start and stop commands.
    * @author Gabriel Aubut-Lussier
    public class Service implements Runnable {
         public final static String START_COMMAND = "start";
         public final static String STOP_COMMAND = "stop";
         public final static String SERVICE_COMMAND = "Service.Command";
         public final static String SERVICE_PORT = "Service.Port";
         private String serviceCommand;
         private int servicePort;
         private Serviceable service;
         private ServerSocket serviceListener;
         private Thread serviceThread;
          * Creates a new service registering the hooks required to perform
          * clean termination sequences.
          * @param s
          * @throws DuplicateServiceException
         public Service(Serviceable s) throws DuplicateServiceException {
              service = s;
              serviceCommand = System.getProperty(SERVICE_COMMAND);
              String servicePortString = System.getProperty(SERVICE_PORT);
              if(servicePortString == null)
                   servicePort = -1;
              else
                   servicePort = Integer.parseInt(servicePortString);
          * Try running this new Service instance if there isn't one
          * already running.
          * @throws DuplicateServiceException if another service instance is already running.
         public void start() throws DuplicateServiceException {
              if(serviceCommand == null || servicePort < 0) {
                   throw new IllegalArgumentException("The command and port number must be specified.");
              if(serviceCommand.equals(START_COMMAND)) {
                   try {
                        serviceListener = new ServerSocket(servicePort);
                        serviceThread = new Thread(this);
                        serviceThread.start();
                        service.startup();
                   } catch(BindException e) {
                        throw new DuplicateServiceException("An instance of the service is already running.");
                   }catch(IOException e) {
                        e.printStackTrace();
              } else if(serviceCommand.equals(STOP_COMMAND)) {
                   shutdown();
          * Provoke a shutdown command.
         public void shutdown() {
              try {
                   Socket sock = new Socket("localhost", servicePort);
                   OutputStreamWriter out = new OutputStreamWriter(sock.getOutputStream());
                   out.write("shutdown");
                   out.flush();
                   out.close();
                   sock.close();
              } catch (UnknownHostException e) {
                   e.printStackTrace();
              } catch (IOException e) {
                   //This exception may occur when trying to stop a service which wasn't running.
                   //There is no need to do anything in this case.
          * While the Service is running, it listens on a port to make sure no
          * other instance of this Service is started and to listen to shutdown
          * commands.
         public void run() {
              boolean keepGoing = true;
              while(keepGoing) {
                   try {
                        Socket sock = serviceListener.accept();
                        InputStreamReader in = new InputStreamReader(sock.getInputStream());
                        char cBuf[] = new char[256];
                        int amount = in.read(cBuf);
                        in.close();
                        sock.close();
                        keepGoing = !((new String(cBuf, 0, amount)).equals("shutdown"));
                   } catch (IOException e) {
                        e.printStackTrace();
              try {
                   service.shutdown();
                   serviceListener.close();
              } catch(IOException e) {
                   e.printStackTrace();
         public String getServiceCommand() {
              return serviceCommand;
         public void setServiceCommand(String serviceCommand) {
              this.serviceCommand = serviceCommand;
         public int getServicePort() {
              return servicePort;
         public void setServicePort(int servicePort) {
              this.servicePort = servicePort;
    Main.java
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import javax.swing.JFrame;
    public class Main implements Serviceable {
         private JFrame window;
         private Service service;
         public static void main(String[] args) {
              new Main();
         public Main() {
              try {
                   service = new Service(this);
                   service.start();
              } catch(DuplicateServiceException e) {
                   e.printStackTrace();
         public void startup() {
              window = new JFrame("SERVICE TEST! :D");
              window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
              window.addWindowListener(new WindowAdapter() {
                   public void windowClosed(WindowEvent e) {
                        service.shutdown();
              window.setVisible(true);
         public void shutdown() {
              System.out.println("Application shutdown");
              window.dispose();
    }Thanks in advance for your feedback.
    -Gabriel Aubut-Lussier

    I have fixed the handshake.
    And even though it isn't implemented yet, I think I have my solution for the limitation of 1 instance per user. I plan on using a hidden file in the user's home directory in which I will write the port number where the running application is listening for events. I have not yet chosen how the port number will be chosen before being written to the file but I am thinking about using a random number between 1024 and 65535. Using this approach, it is possible to maintain all the features I've implemented in the Single Overall Instance solution I already have.
    Here is the code with the handshake fixed:
    Serviceable.java
    * Serviceable cares about two parts of the life of a Service.  Its startup
    * and its shutdown sequences.  The startup occurs only after making sure
    * no other instance of the Service is running.  Shutdown has to be
    * synchronized between multiple threads since it is possible to shutdown
    * the service through a shutdown command sent by another process, or through
    * the normal flow of execution of the service.  Moreover, when another instance
    * is prevented from being launched, the running instance is notified so that it
    * can react to such an event.
    * @author Gabriel Aubut-Lussier
    public interface Serviceable {
          * Initiates the startup of the Service since we have made sure
          * that there isn't any other instance of the Service running.
         public void startup();
          * Notifies the Service that the application has been invoked again in
          * case the running instance wants to react to such an event.  Most GUI
          * applications will just bring themselves to the front while background
          * services will maybe just want to re-scan their configuration files or
          * just ignore the event.
         public void invoke();
          * Initiates the shutdown of the Service since we've received
          * a shutdown request from one of the two supported means of
          * shutting down.
         public void shutdown();
    DuplicateInstanceException.java
    public class DuplicateServiceException extends Exception {
          * serialVersionUID?  Bah. Eclipse generates one automatically so why not...
         private static final long serialVersionUID = 3929576386522489749L;
         public DuplicateServiceException() {
              super();
         public DuplicateServiceException(String msg) {
              super(msg);
    Service.java
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.BindException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.UnknownHostException;
    * The same way a graphical application is running as long as there
    * is something to display, a background service will run as long as
    * there is an active Thread.
    * A service can be terminated in different ways.  First of all, it
    * can be terminated through its normal flow of execution.  On the
    * other hand, it is possible to provoke the termination of a Service
    * externally.
    * To terminate the service through the normal flow, just call the
    * Service.shutdown() method.  Another way to terminate the service
    * is to start a new instance of the program with the Stop command.
    * This Service implementation will behave according to two system
    * properties.  The property Service.Command can be set to "start"
    * or "stop".  When set to "start", the Service will make sure there
    * isn't another instance of the service already running.  If it is
    * the case, a DuplicateServiceException will be thrown.  In the
    * other case, the Service will start.  When the "stop" command is
    * invoked, the Service will attempt to stop a running instance of
    * the Service.  The other property is Service.Port and it defines
    * the Port number which will be used to support the functionalities
    * offered by the Service class.
    * It is recommended to set these properties as command line arguments
    * when launching the application.  Moreover, batch files or shell
    * scripts can be created for invoking the start and stop commands.
    * @author Gabriel Aubut-Lussier
    public class Service implements Runnable {
         public final static String START_COMMAND = "start";
         public final static String STOP_COMMAND = "stop";
         public final static String SERVICE_COMMAND = "Service.Command";
         public final static String SERVICE_PORT = "Service.Port";
         private final static String GREETING = "Greetings";
         private final static String QUERY = "?";
         private final static String ACCEPT = "yes";
         private final static String DECLINE = "no";
         private final static String SHUTDOWN = "shutdown ";
         private final static int SO_TIMEOUT = 100;
          * This is the application-specific String
         private String serviceClass;
          * This is the command which we will execute when start() is invoked
          * The value is either "start" or "stop"
          * This value can be configured using the System property: Service.Command
         private String serviceCommand;
          * This is the port which is used to watch for duplicate instances
          * This value can be configured using the System property: Service.Port
         private int servicePort;
         private Serviceable service;
         private ServerSocket serviceListener;
         private Thread serviceThread;
          * Creates a new service registering the hooks required to perform
          * clean termination sequences.
          * @param s A Serviceable class
          * @throws DuplicateServiceException If there is a duplicate instance running
         public Service(Serviceable s) throws DuplicateServiceException {
              service = s;
              serviceClass = s.getClass().toString();
              serviceCommand = System.getProperty(SERVICE_COMMAND);
              String servicePortString = System.getProperty(SERVICE_PORT);
              if(servicePortString == null)
                   servicePort = -1;
              else
                   servicePort = Integer.parseInt(servicePortString);
          * Try running this new Service instance if there isn't one
          * already running.
          * @throws DuplicateServiceException if another service instance is already running.
          * @throws BindException if another application is using the configured port.
         public void start() throws DuplicateServiceException, BindException {
              if(serviceCommand == null || servicePort < 0 || servicePort > 65535) {
                   throw new IllegalArgumentException("The command and port number must be specified.");
              if(serviceCommand.equals(START_COMMAND)) {
                   try {
                        serviceListener = new ServerSocket(servicePort);
                        serviceThread = new Thread(this);
                        serviceThread.start();
                        service.startup();
                   } catch(BindException e) {
                        queryOtherInstance();
                        throw e;
                   } catch(IOException e) {
                        e.printStackTrace();
              } else if(serviceCommand.equals(STOP_COMMAND)) {
                   shutdown();
          * Send the shutdown command to the running instance of the application.
         public boolean shutdown() {
              boolean shutdownSuccessful = false;
              try {
                   Socket sock = new Socket("localhost", servicePort);
                   sock.setSoTimeout(SO_TIMEOUT);
                   //If the greeting doesn't match, it's not a duplicate instance
                   //and we can't shut it down
                   InputStreamReader in = new InputStreamReader(sock.getInputStream());
                   OutputStreamWriter out;
                   if(receivedGreeting(in)) {
                        //Sending the shutdown command
                        out = new OutputStreamWriter(sock.getOutputStream());
                        out.write(SHUTDOWN + serviceClass);
                        out.flush();
                        //Read the confirmation
                        char cBuf[] = new char[1024];
                        int amount = in.read(cBuf);
                        String confirmation = new String(cBuf, 0, amount);
                        if(confirmation.equals(ACCEPT)) {
                             shutdownSuccessful = true;
                        out.close();
                   //Closing the connection
                   in.close();
                   sock.close();
              } catch (UnknownHostException e) {
                   //This exception shouldn't happen unless the loopback address doesn't exist?
              } catch (IOException e) {
                   //This exception may occur when trying to stop a service which wasn't running.
                   //There is no need to do anything in this case.
              return shutdownSuccessful;
          * Reads the greeting from the running instance we are interacting with.
          * @param in An InputStreamReader built on the Socket's InputStream
          * @return True if we received the expected greeting, false otherwise
          * @throws IOException if a problem occurs while receiving the greeting
         private boolean receivedGreeting(InputStreamReader in) throws IOException {
              //Reading the expected greeting from the server
              char cBuf[] = new char[1024];
              int amount = in.read(cBuf);
              String greeting = new String(cBuf, 0, amount);
              return greeting.equals(GREETING);
          * While the Service is running, it listens on a port to make sure no
          * other instance of this Service is started and to listen to shutdown
          * commands.
         public void run() {
              boolean keepGoing = true;
              while(keepGoing) {
                   Socket sock;
                   InputStreamReader in;
                   try {
                        sock = serviceListener.accept();
                        sock.setSoTimeout(SO_TIMEOUT);
                        //Sending a greeting
                        OutputStreamWriter out = new OutputStreamWriter(sock.getOutputStream());
                        out.write(GREETING);
                        out.flush();
                        //Reading the incoming message
                        in = new InputStreamReader(sock.getInputStream());
                        char cBuf[] = new char[1024];
                        int amount = in.read(cBuf);
                        String message = new String(cBuf, 0, amount);
                        //Writing an answer
                        boolean invoked = message.equals(serviceClass + QUERY);
                        if(invoked) {
                             out.write(ACCEPT);
                        } else {
                             out.write(DECLINE);
                             keepGoing = !message.equals(SHUTDOWN + serviceClass);
                        out.flush();
                        //Closing the connection
                        out.close();
                        in.close();
                        sock.close();
                        //Notify the running application is there has been an invocation
                        if(invoked) {
                             service.invoke();
                   } catch (IOException e) {
                        //Seems like an IO operation failed.  Let's just forget about
                        //this connection attempt and wait for another
              //Shutdown the Service
              service.shutdown();
              try {
                   serviceListener.close();
              } catch(IOException e) {
                   //Couldn't close the serverSocket upon shutdown?
                   //weird... but anyhow...
          * Connects to the configured port to check out wether it is a duplicate
          * instance of the application or if it is another application using the
          * same port number.  If it is another application, nothing will happen.
          * @throws DuplicateServiceException if it is a duplicate instance
         private void queryOtherInstance() throws DuplicateServiceException {
              try {
                   Socket sock = new Socket("localhost", servicePort);
                   sock.setSoTimeout(SO_TIMEOUT);
                   //Read greeting
                   InputStreamReader in = new InputStreamReader(sock.getInputStream());
                   String answer = null;
                   if(receivedGreeting(in)) {
                        //Writing the application-specific query
                        OutputStreamWriter out = new OutputStreamWriter(sock.getOutputStream());
                        out.write(service.getClass().toString() + "?");
                        out.flush();
                        //Reading the answer
                        char[] cBuf = new char[3];
                        int amount = in.read(cBuf);
                        answer = new String(cBuf, 0, amount);
                        out.close();
                   //Closing the connection
                   in.close();
                   sock.close();
                   //If the answer is "yes" then it is a duplicate
                   if(answer != null && answer.equals("yes")) {
                        throw new DuplicateServiceException("An instance of the service is already running.");
              } catch (UnknownHostException e) {
                   //This exception shouldn't happen unless the loopback address doesn't exist?
              } catch (IOException e) {
                   //If we fail to query the application appropriately we consider
                   //it isn't a duplicate entry so we do nothing.
         public String getServiceCommand() {
              return serviceCommand;
         public void setServiceCommand(String serviceCommand) {
              this.serviceCommand = serviceCommand;
         public int getServicePort() {
              return servicePort;
         public void setServicePort(int servicePort) {
              this.servicePort = servicePort;
    Main.java
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.net.BindException;
    import javax.swing.JFrame;
    public class Main implements Serviceable {
         private JFrame window;
         private Service service;
         public static void main(String[] args) {
              new Main();
         public Main() {
              try {
                   service = new Service(this);
                   service.start();
              } catch(DuplicateServiceException e) {
                   e.printStackTrace();
              } catch(BindException e) {
                   e.printStackTrace();
         public void startup() {
              window = new JFrame("SERVICE TEST! :D");
              window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
              window.addWindowListener(new WindowAdapter() {
                   public void windowClosed(WindowEvent e) {
                        service.shutdown();
              window.setVisible(true);
         public void shutdown() {
              System.out.println("Application shutdown");
              window.dispose();
         public void invoke() {
              System.out.println("Another instance tried to startup");
              window.toFront();
    }

  • Sql exception access denied

    well as the topic says I get an access denied exception. This is when I try to connect to the database
    java.sql.SQLException: Access denied for user 'Java'@'localhost' (using password: YES)
    I get the same problem when I try to connect with the root user.
    this is the code I'm using, ignore the threads as they do not matter
    devil_server.java
    import java.io.*;
    import java.net.MalformedURLException;
    import java.net.*;
    import java.sql.*;
    import java.util.*;
    public class devil_server
    //variable types concerning userthreads
    static public int uid;
    static public int nou;
    static public ServerSocket skanal;
    public static Vector users = new Vector();
    public static Vector usernames = new Vector();
    public static String user;
    public static String pass;
         public static void main(String arg[])
         try {
              System.out.println("write the user used to access the mysql database with Devil Chat");
              user = Keyboard.readString(); //read mysql username from keyboard
              System.out.println("write the password used to access the mysql database with Devil Chat");
              String pass = Keyboard.readString(); //read password for user from keyboard
              uid = 0;
              nou = 0; //Number Of Users
              skanal = new ServerSocket(5555);
              new Thread(new devil_server_user(uid)).start();
              while(true)
                   if(uid>nou)
                        String buffer = "buffer";
                        String userl = "user";
                        users.add(buffer);
                        usernames.add(userl);
                        new Thread(new devil_server_user(uid)).start();
                        nou++;
            }//end while
              }/*end try*/ catch (Exception ex) {
               ex.printStackTrace();
              }//end catch
              //con.close
         } //end main
    }//end classdevil_server_user.java
    import java.io.*;
    import java.net.MalformedURLException;
    import java.net.*;
    import java.util.*;
    import java.sql.*;
    public class devil_server_user implements Runnable
    public devil_server_user (int uid){this.uid=uid;};
    public int uid;
    public Socket kanal;
    public InetAddress ip;
    public InputStream streamin;
    public OutputStream streamout;
    public BufferedReader bufferind;
    public PrintWriter printout;
    public String lastuserin;
    public String userinput;
    public String sip;
    public int isadmin;
    //variable types concerning mysql database connectivity
    public Statement stmt;
    //public Statement rstmt;
    public ResultSet rs;
    public Connection conn;
         public void run()
              try {
         System.out.println("Listening on port 5555");
         System.out.println("Waiting for clients");
         kanal = devil_server.skanal.accept();
         devil_server.uid++;
         ip = kanal.getInetAddress();
         sip = ip.toString();
         sip = sip.replace("/","");
         isadmin = 0;
         if(sip.equals("127.0.0.1"))
         isadmin = 1;
         } catch (Exception ex) {
         ex.printStackTrace();
         try {
         System.out.println("Incomming request: "+ ip);
         streamin = kanal.getInputStream();
         System.out.println("Input ready");
         streamout = kanal.getOutputStream();
         System.out.println("Output ready");
         devil_server.users.set(this.uid, printout = new PrintWriter(streamout));
         printout = (PrintWriter)devil_server.users.get(this.uid);
         bufferind = new BufferedReader(new InputStreamReader(streamin));
         catch (IOException e){
         e.printStackTrace();
        try { 
         Class.forName("com.mysql.jdbc.Driver").newInstance();
         conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/Java?user="+devil_server.user+"&password=s"+devil_server.pass);
         stmt = conn.createStatement();
         stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
         } catch (Exception e) {
         e.printStackTrace();
         //String request = bufferind.readLine();
         //System.out.println("message from "+ip+" : "+request);
         //printout.flush();
    //forbindelse
    try {
         userinput = (String)bufferind.readLine();
         } catch(Exception e) {
         e.printStackTrace();
         while(!userinput.startsWith("/name"))
         try {
              userinput = (String)bufferind.readLine();
                   } catch(Exception e) {
         e.printStackTrace();
         try
         stmt = conn.createStatement();
         stmt.executeUpdate("INSERT INTO devilchat_users (ip, username, isadmin) VALUES('"+sip+"',' "+userinput.substring(6)+"','"+isadmin+"')");
         new Thread(new devil_server_broadcast("/say "+userinput.substring(6)+" has joined devilchat")).start();
         devil_server.usernames.set(this.uid, userinput.substring(6));
         printout.println("/knock"); //knocks to the client
         printout.flush();
         userinput = (String)bufferind.readLine();
              } catch(Exception e) {
         e.printStackTrace();
         while(!userinput.startsWith("/knock"))
         try {
         userinput = (String)bufferind.readLine(); //waiting for client to knock back
              } catch(Exception e) {
         e.printStackTrace();
         printout.println("/ready"); //tells client it's ready to read userinput
         printout.flush();
         int spoken = 0;
         System.out.println(devil_server.usernames.get(this.uid)+": has connected");
         new Thread(new devil_server_usercheck()).start();
    //starter l�kke som checker for nye input fra useren
         while(true)
         try{
              userinput = (String)bufferind.readLine();
              if(!userinput.equals(lastuserin))
              if(userinput.startsWith("/name"))
              stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
              rs = stmt.executeQuery("SELECT * FROM devilchat_users WHERE uid='"+this.uid+"'");
              rs.absolute(this.uid);
              String oldname = rs.getString("username"); // get old name from database and save it in a string before applying the new name
              stmt = conn.createStatement();
              stmt.executeUpdate("UPDATE devilchat_users set username='"+userinput.substring(6)+"' WHERE uid ='"+this.uid+"'");
              //start a broadcast to tell the name has changed
              new Thread(new devil_server_broadcast("/namechange *** "+oldname+" has changed their name to "+userinput.substring(6)+" ***")).start();
              //change the username in the vector containing usernames
              devil_server.usernames.set(this.uid, userinput.substring(6));
              //start a new listcheck so the list can be updated
              new Thread(new devil_server_usercheck()).start();
              else if(userinput.startsWith("/say"))
              stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
              rs = stmt.executeQuery("SELECT * FROM devilchat_users WHERE uid='"+this.uid+"'");
              rs.absolute(this.uid);
              String sname = rs.getString("username");
              String say1 = userinput.substring(6);
              userinput = "/say "+sname+": "+say1;
              spoken++;
              stmt = conn.createStatement();
              stmt.executeUpdate("UPDATE devilchat_users set spoken='"+spoken+"' WHERE uid ='"+this.uid+"'");
              new Thread(new devil_server_broadcast(userinput)).start();
              else if(userinput.startsWith("/quit"))
              stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
              rs = stmt.executeQuery("SELECT * FROM devilchat_users WHERE uid='"+this.uid+"'");
              rs.absolute(this.uid);
              String name = rs.getString("username");
              printout.println("/quit "+name+" has left devilchat"); //tells client it's ready to read userinput
              printout.flush();
              devil_server.usernames.set(this.uid, "user");
              devil_server.users.set(this.uid, "buffer");
              new Thread(new devil_server_broadcast("/quit "+name+" has left devilchat")).start();
              conn.close();
              kanal.close();
              break;
              lastuserin = userinput;
         catch(Exception e) {
         e.printStackTrace();
    }this is the full exception handling
    java.sql.SQLException: Access denied for user 'Java'@'localhost' (using password
    : YES)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1056)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3376)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3308)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:894)
    at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3808)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1256)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2032)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:729)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou
    rce)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java
    :283)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at devil_server_user.run(devil_server_user.java:71)
    at java.lang.Thread.run(Unknown Source)
    java.lang.NullPointerException
    at devil_server_user.run(devil_server_user.java:97)
    at java.lang.Thread.run(Unknown Source)
    I have tried the org driver too and I have tried (url, user, pass) and (url?user=user&password=pass)
    Edited by: Angelwinged_Devil on Mar 13, 2008 6:04 AM

    well it's pretty weird, because I'm trying to make some kind of pattern with the install file I made, although... the install file works and looks like this
    import java.io.*;
    import java.net.*;
    import java.sql.*;
    public class install
        public static void main(String[] args) {
            try {
                // The newInstance() call is a work around for some
                   //older java implementations
                   //org.gjt.mm.mysql.Driver or com.mysql.jdbc.driver
                Class.forName("org.gjt.mm.mysql.Driver").newInstance();
            } catch (Exception ex) {
                ex.printStackTrace();
              try {
              System.out.println("write the user used to access the mysql database with Devil Chat");
              String user = Keyboard.readString(); //read mysql username from keyboard
              System.out.println("write the password used to access the mysql database with Devil Chat");
              String pass = Keyboard.readString(); //read password for user from keyboard
              Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mysql", user, pass);
              Statement stmt = conn.createStatement();
              stmt.executeUpdate("CREATE DATABASE IF NOT EXISTS Java");
              System.out.println("Database has been created");
              Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/Java", user, pass);
              Statement nstmt = con.createStatement();
              nstmt.executeUpdate("CREATE TABLE IF NOT EXISTS devilchat_users ("+
              "uid int NOT NULL AUTO_INCREMENT, PRIMARY KEY(uid), "
              +"username varchar(25), isadmin bool, spoken int, ip varchar(15))");
              System.out.println("Table has been created");
              con.close();
              conn.close();
                   } catch (SQLException ex) {
        // handle any errors
        System.out.println("SQLException: " + ex.getMessage());
        System.out.println("SQLState: " + ex.getSQLState());
        System.out.println("VendorError: " + ex.getErrorCode() + "\n");
    }

  • Dynamic class loading when CODEBASE is unreachable. A bug?

    Let us suppose that we have a large-scale distributed application with ca. 1000 participants communicating via RMI and utilizing dynamic class loading. As we all know, a HTTP code server must be available for this purpose in order to provide dynamically downloaded code, usually the communication proxy code of remote objects. In a real-world scenario, the HTTP server will never be 100% available, so that we will have cases that a Java process will not be able to download the necessary Java classes, causing the RMI communication to fail with a ClassNotFoundException or similar exception. In such a case, a robust application would perform some recovery activities and retry the remote call. Eventually, the HTTP server becomes available again and the distributed system recovers automatically. This seems to work fine with J2SE 1.4.2_10, but not with 1.4.2_11 and newer versions. Considering Java 5, the Update 9 exhibits the same problem.
    For tracking down the problem, I've written a simple distributed test application, consisting of a client and a server. A server listens on a port, and sends a MarshalledObject to the client. The code of the MarshalledObject is annotated with the value of the "java.rmi.server.codebase" system property. The annotation contains an URL of the JAR file containing the code of the original object. The client connects to the server, reads data form the socket and unmarshalls the original object. This is basically the same procedure as when objects are accross the wire as arguments/return values/exceptions by the RMI/JRMP engine. This procedure is repeated forever in the loop. Due to the fact that the client's CLASSPATH doesn't contain the code of the original object, this code should dynamically be loaded from the HTTP server using the appropriate annotation provided by the server.
    If we start the client while the HTTP server is down, the client will keep generating the ClassNotFoundException over and over again, as expected. So far, so good. If we now start the HTTP server while the client is still running, we will observe different behaviors, depending on the version of the client's JVM:
    1. In J2SE 1.4.2_10, the client will download the code from the HTTP server and successfully unmarshal the original object sent by the server. ClassNotFoundExceptions will not be generated again.
    2. In J2SE 1.4.2_11, 1.4.2_12 and 1.4.2_13 as well as in J2SE 5.0 Update 9, the client will continue generating ClassNotFoundExceptions. Analysis of the HTTP server's access log shows that there were no attempts to download the JAR file required for unmarshaling the object sent by the server.
    It seems that in the newer JVM versions the RMI engine remembers URLs which have failed and does not attempt to access them anymore. Althogh this may have some advantages considering the overall network load, the dynamical class loading becomes practically useless in productive large distributed systems. The very first attempt to load the codebase of the communication peer must succeed, otherwise the whole process must be restarted for the communication to work, which is a very expensive (and for most customers unacceptable) operation in terms of preformance and resources usage.
    Should this be seen as a bug or a feature of the JVM? What do you think?
    Regards,
    Miran
    Here is the code to reproduce:
    Server code
    package server;
    import java.net.*;
    import java.rmi.*;
    import java.io.*;
    public class Server implements Serializable {
      private int value = 42;
      public Server() {
      public String toString() {
        return "The Answer is " + value;
      public static void main( String[] args ) {
        if( args.length!=1 ) {
          System.out.println( "Usage: server.Server <port>" );
          System.exit( 1 );
        try {
          MarshalledObject data = new MarshalledObject( new Server() );
          int port = Integer.parseInt( args[0] );
          ServerSocket serverSocket = new ServerSocket( port );
          System.out.println( "Accepting connections..." );
          while( true ) {
            Socket s = serverSocket.accept();
            new Thread( new SocketHandler( s, data ) ).start();
        } catch( Exception ex ) {
          ex.printStackTrace();
        System.exit( 0 );
      public static class SocketHandler implements Runnable {
        private Socket s;
        private Serializable data;
        public SocketHandler( Socket s, Serializable data ) {
          this.s = s;
          this.data = data;
        public void run() {
          try {
            OutputStream os = s.getOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream( os );
            oos.writeObject( data );
            oos.close();
            os.close();
            s.close();
            System.out.println( "Serving socket succeeded" );
          } catch( Exception ex ) {
            System.out.println( "Serving socket failed" );
            ex.printStackTrace();
    Client code
    package client;
    import java.rmi.*;
    import java.net.*;
    import java.io.*;
    public class Client {
      public static void main( String[] args ) {
        if( args.length!=1 ) {
          System.out.println( "Usage: client.Client <port>" );
          System.exit( 1 );
        try {
          if( System.getSecurityManager()==null ) {
            System.setSecurityManager( new RMISecurityManager() );
          int port = Integer.parseInt( args[0] );
          for( int i = 1; true; ++i ) {
            try {
              Socket s = new Socket( "localhost", port );
              InputStream is = s.getInputStream();
              ObjectInputStream ois = new ObjectInputStream( is );
              Object o = ois.readObject();
              ois.close();
              is.close();
              s.close();
              Object umo = ((MarshalledObject) o).get();
              System.out.println( i + ". Retreiving MarshalledObject succeeded: "
                                  + umo );
            } catch( Exception ex ) {
              System.out.println( i + ". Retreiving MarshalledObject failed" );
              ex.printStackTrace();
            System.out.println( i + ". Waiting for 10 sec" );
            Thread.sleep( 10000 );
        } catch( Exception ex ) {
          ex.printStackTrace();
        System.exit( 0 );
    Start command for the server
    java -cp server.jar -Djava.rmi.server.codebase="http://localhost/playground/server.jar" server.Server 33933
    Start command for the client
    java -cp client.jar -Djava.security.policy=all.policy client.Client 33933
    The policy.all file should look as follows
    // All permissions
    grant {
       permission java.security.AllPermission;
    };The server.jar file should only contain the classes from the server package. This file should also be made accessible via HTTP (e.g. by using the Apache HTTP server).
    The client.jar file should only contain the classes from the client package.

    no body know about this??

  • Server - Object I/O Streams and EOFException

    Hello.
    Suppose this is my Server
    public class Server implements Runnable {
      // Default port.
      private static final int DEFAULT_PORT = 9999;
      // Sockets - one client for simplicity.
      private final ServerSocket server;
      private Socket client;
      public Server() throws IOException {
        this(DEFAULT_PORT);
      public Server(int port) throws IOException {
        if (port < 1024 || port > 65535)
          throw new IllegalArgumentException();
        server = new ServerSocket(port);
        new Thread(this).start();
      public void run() {
        ObjectInputStream input = null;
        ObjectOutputStream output = null;
        try {
          // Initialize
          client = server.accept();
          input = new ObjectInputStream(client.getInputStream());
          output = new ObjectOutputStream(client.getOutputStream());
          while(true) {
            Thingie t = (Thingie) input.readObject();
            editThingie(t);
            ouput.writeObject(t);
            output.flush();
        } catch (Exception e) {
          e.printStackTrace();
        } finally {
          try {
         client.close();
          } catch (Exception e) {
         e.printStackTrace();
    }after this Server reads and edits the first Thingie it encounters, it throws EOFException. I would really like to avoid that. In other words, I'd like the Server to be up and running, being ready to edit infinitely many Thingies. Any hints / tips on how to achieve that?
    Thank you.

    You are not looping correctly.Could you be a bit more specific?
    Is your client sending one thingie and then closing its end of the connection?
    If so, then that is the end of that Stream on the server.No, that is not the case. The Client is a bit different than the normal approach, though. There is no need for user input - a method invocation suffices to send a Thingie to the Server. To make things clearer, here's the code:
    public class Client {
      // Default port
      private static final int DEFAULT_PORT = 9999;
      // Socket
      private final Socket client;
      // Socket I/O
      private ObjectOutputStream output;
      private ObjectInputStream input;
      public Client() throws IOException {
        this(DEFAULT_PORT);
      public Client(int port) throws IOException {
        if (port < 1024 || port > 65535)
          throw new IllegalArgumentException();
        client = new Socket("localhost", port);
        output = new ObjectOutputStream(client.getOutputStream());
        input = new ObjectInputStream(client.getInputStream());
      public Thingie toServer(Thingie t) throws Exception {
        output.writeObject(t);
        output.flush();
        return (Thingie) input.readObject();
      public void close() throws IOException {
        client.close();
    }

  • Socket for broadcast and receive?

    Hi all,
    sorry for cross post but I need an answer soon.
    The server need to broadcast an inviting message continuosly. and at the same time the socket is able to receive any messages from the client.
    I use 2 threads. One iniiated with Socket for listening and the other multicast socket with datagram.
    However, I don't think I did it the right way?????
    one thread: skt = new ServerSocket(4446);
    broadcast thread:
    MulticastSocket socket = new MulticastSocket(4446);
    InetAddress address = InetAddress.getByName("230.0.0.1");
    socket.joinGroup(address);
    DatagramPacket packet;
    any suggestions?
    Any souce code for server and client?
    any documents, url?
    thanks
    andrew

    ServerSockets go with MulticastSockets like baloney and whip cream.
    ServerSockets are for connection-based sockets.
    MulticastSockets are for connection-less datagram sockets
    Pick one type based on your requirements and stick with it.
    Either ServerSockets and Sockets
    or MulticastSocket with MulticastSocket.

  • Socket for both broadcast and receive?

    Hi all,
    The server need to broadcast an inviting message continuosly. and at the same time the socket is able to receive any messages from the client.
    I use 2 threads. One iniiated with Socket for listening and the other multicast socket with datagram. However, I don't think I did it the right way?
    one thread: skt = new ServerSocket(4446);
    broadcast thread:
    MulticastSocket socket = new MulticastSocket(4446);
    InetAddress address = InetAddress.getByName("230.0.0.1");
         socket.joinGroup(address);
    DatagramPacket packet;
    With this, how can the client receive and send at the same time?
    Any souce code for server and client?
    any documents, url?
    thanks
    andrew

    ServerSockets go with MulticastSockets like baloney and whip cream.
    ServerSockets are for connection-based sockets.
    MulticastSockets are for connection-less datagram sockets
    Pick one type based on your requirements and stick with it.
    Either ServerSockets and Sockets
    or MulticastSocket with MulticastSocket.

  • Little help please with forwarding traffic to proxy server!

    hi all, little help please with this error message
    i got this when i ran my code and requested only the home page of the google at my client side !!
    GET / HTTP/1.1
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
    Accept-Language: en-us
    UA-CPU: x86
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.2; .NET CLR 2.0.50727)
    Host: www.google.com
    Connection: Keep-Alive
    Cookie: PREF=ID=a21457942a93fc67:TB=2:TM=1212883502:LM=1213187620:GM=1:S=H1BYeDQt9622ONKF
    HTTP/1.0 200 OK
    Cache-Control: private, max-age=0
    Date: Fri, 20 Jun 2008 22:43:15 GMT
    Expires: -1
    Content-Type: text/html; charset=UTF-8
    Content-Encoding: gzip
    Server: gws
    Content-Length: 2649
    X-Cache: MISS from linux-e6p8
    X-Cache-Lookup: MISS from linux-e6p8:3128
    Via: 1.0
    Connection: keep-alive
    GET /8SE/11?MI=32d919696b43409cb90ec369fe7aab75&LV=3.1.0.146&AG=T14050&IS=0000&TE=1&TV=tmen-us%7Cts20080620224324%7Crf0%7Csq38%7Cwi133526%7Ceuhttp%3A%2F%2Fwww.google.com%2F HTTP/1.1
    User-Agent: MSN_SL/3.1 Microsoft-Windows/5.1
    Host: g.ceipmsn.com
    HTTP/1.0 403 Forbidden
    Server: squid/2.6.STABLE5
    Date: Sat, 21 Jun 2008 01:46:26 GMT
    Content-Type: text/html
    Content-Length: 1066
    Expires: Sat, 21 Jun 2008 01:46:26 GMT
    X-Squid-Error: ERR_ACCESS_DENIED 0
    X-Cache: MISS from linux-e6p8
    X-Cache-Lookup: NONE from linux-e6p8:3128
    Via: 1.0
    Connection: close
    java.net.SocketException: Broken pipe // this is the error message
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:115)
    at java.io.DataOutputStream.writeBytes(DataOutputStream.java:259)
    at SimpleHttpHandler.run(Test77.java:61)
    at java.lang.Thread.run(Thread.java:595)
    at Test77.main(Test77.java:13)

    please could just tell me what is wrong with my code ! this is the last idea in my G.p and am havin difficulties with that cuz this is the first time dealin with java :( the purpose of my code to forward the http traffic from client to Squid server ( proxy server ) then forward the response from squid server to the clients !
    thanx a lot,
    this is my code :
    import java.io.*;
    import java.net.*;
    public class Test7 {
    public static void main(String[] args) {
    try {
    ServerSocket serverSocket = new ServerSocket(1416);
    while(true){
    System.out.println("Waiting for request");
    Socket socket = serverSocket.accept();
    new Thread(new SimpleHttpHandler(socket)).run();
    socket.close();
    catch (Exception e) {
    e.printStackTrace();
    class SimpleHttpHandler implements Runnable{
    private final static String CLRF = "\r\n";
    private Socket client;
    private DataOutputStream writer;
    private DataOutputStream writer2;
    private BufferedReader reader;
    private BufferedReader reader2;
    public SimpleHttpHandler(Socket client){
    this.client = client;
    public void run(){
    try{
    this.reader = new BufferedReader(
    new InputStreamReader(
    this.client.getInputStream()
    InetAddress ipp=InetAddress.getByName("192.168.6.29"); \\ my squid server
    System.out.println(ipp);
    StringBuffer buffer = new StringBuffer();
    Socket ss=new Socket(ipp,3128);
    this.writer= new DataOutputStream(ss.getOutputStream());
    writer.writeBytes(this.read());
    this.reader2 = new BufferedReader(
    new InputStreamReader(
    ss.getInputStream()
    this.writer2= new DataOutputStream(this.client.getOutputStream());
    writer2.writeBytes(this.read2());
    this.writer2.close();
    this.writer.close();
    this.reader.close();
    this.reader2.close();
    this.client.close();
    catch(Exception e){
    e.printStackTrace();
    private String read() throws IOException{
    String in = "";
    StringBuffer buffer = new StringBuffer();
    while(!(in = this.reader.readLine()).trim().equals("")){
    buffer.append(in + "\n");
    buffer.append(in + "\n");
    System.out.println(buffer.toString());
    return buffer.toString();
    private String read2() throws IOException{
    String in = "";
    StringBuffer buffer = new StringBuffer();
    while(!(in = this.reader2.readLine()).trim().equals("")){
    buffer.append(in + "\n");
    System.out.println(buffer.toString());
    return buffer.toString();
    Edited by: Tareq85 on Jun 20, 2008 5:22 PM

  • Details for last question I post

    the original code for last question I post(about the DataInputStream& EOFException) is here, thanks if anyone will bother to read it
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.net.*;
    import java.io.* ;
    public class MasterMindServer
         public MasterMindServer()
              try{
                   ServerSocket serverSocket=new ServerSocket(8000);
                   Socket socket=serverSocket.accept();
                   HandleAClient thread=new HandleAClient(socket);
                   thread.start();
                   }catch(IOException e){System.out.println("Error:"+e.toString());}
         public static void main(String args[])
              new MasterMindServer();
    //inner class
    class HandleAClient extends Thread
         DataOutputStream out;
         DataInputStream in;
         BufferedReader fromFile;
         private Socket socket;
         String line;
         public HandleAClient(Socket socket)
              this.socket=socket;
         public void run()
              int x,o;
              try{
                     out=new DataOutputStream(socket.getOutputStream());
                   in=new DataInputStream(socket.getInputStream());
                   fromFile=new BufferedReader(new FileReader("colorcode.txt"));
                  while((line=fromFile.readLine())!=null)
                    for(int i=0;i<10;i++)
                      String t=in.readUTF();
                      x=check_column(t);
                       System.out.println(x);
                       o=check_color(t);
                       System.out.println(o);
                       out.writeInt(x);
                       out.writeInt(o);
                       if(x==6) break;
                     out.writeUTF(line);
                   socket.close();
                   System.out.println("close");
             }catch(IOException e){
             System.out.println("Error:"+e.toString());}
         public int check_column(String s)
              String str;
              str=s;
              int count=0;
              for(int i=0;i<6;i++)
                   if(s.charAt(i)==line.charAt(i))
                   count++;
              return count;
         public int check_color(String s)
              String str;
              str=s;
              int count=0;
              for(int i=0;i<6;i++)
                   if((line.indexOf(s.charAt(i))!=-1)&&(line.charAt(i)!=s.charAt(i)))
                   count++;
              return count;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.net.*;
    import java.io.* ;
    public class MasterMindClient extends JFrame implements MouseListener,ActionListener
      /** Default constructor */
      //keep track of the row (or trial) and column number
      int trial_num, col_now ;
      Socket socket;
      int count[]={5,5,5,5,5,5};
    JPanel A[]  = new JPanel[10];
      JPanel B1[] = new JPanel[10];
      JPanel B2[] = new JPanel[10] ;
      JPanel notice = new JPanel() ;
      JPanel sub_notice = new JPanel();
      JPanel D1, D2 ;
      static JTextField [][]color = new JTextField[10][6] ;
      static JTextField [][]Output = new JTextField[10][2];
      static JTextField [][]Answer = new JTextField[1][6] ;
      static JButton []ok = new JButton[10];  
      JLabel L1 = new JLabel("Click the textfield to change color");
      JLabel L2 , L3, L4 ;
      String colorRange="BCGRYW";
      Color colorName[]={Color.black,Color.cyan,Color.green,Color.red,Color.yellow,Color.white};
      String temp ;
    public MasterMindClient() {
        // initialize
        trial_num = 0;
        col_now = 0;
        //sub_notice is Panel where the heading labels are placed
        sub_notice.setLayout(new GridLayout(1,3)) ;
        L2 = new JLabel("  ") ;
        L3 = new JLabel("X");
        L3.setHorizontalAlignment(JTextField.CENTER);
        L4 = new JLabel("O");
        L4.setHorizontalAlignment(JTextField.CENTER);
        L3.setToolTipText("matching color and column");
        L4.setToolTipText("matching color but not matching column" );
        sub_notice.add(L2);
        sub_notice.add(L3);
        sub_notice.add(L4);
        notice.setLayout(new GridLayout(1,2)) ;
        notice.add(L1) ;
        notice.add(sub_notice) ;
        // Get the content pane of the frame
        Container c = getContentPane();
        // Set GridLayout, 4 rows, 3 columns, and gaps 5 between
        // components horizontally and vertically
        c.setLayout(new GridLayout(12, 1, 5, 5));
        c.add(notice);
         JPanel Display = new JPanel() ;
         Display.setLayout(new GridLayout(1,2,5,5)) ;
       //create a Panel for each row to accept use input
       // color[][] textfield is where the user input
       // Output[][] is where to display the number of X and O
        for (int i = 0; i <= A.length-1 ; i++)
        A[i] = new JPanel() ;
        A.setLayout(new GridLayout(1, 2,10,10));
    B1[i] = new JPanel();
    B1[i].setLayout(new GridLayout(1,6,5,5)) ;
    B2[i] = new JPanel();
    B2[i].setLayout(new GridLayout(1,3,5,5)) ;
    for (int j = 0; j <= color[i].length-1 ; j++)
    color[i][j] = new JTextField() ;
    color[i][j].setHorizontalAlignment(JTextField.CENTER);
    if (i == 0)
    {color[i][j].setEditable(true) ;
    else
    {color[i][j].setEditable(false);
    color[i][j].addMouseListener(this);
    B1[i].add(color[i][j]) ;
    } // j loop
    ok[i] = new JButton("SEND");
    if(i==0)
         ok[i].setEnabled(true);
    else
         ok[i].setEnabled(false);
    ok[i].addActionListener(this);
    B2[i].add(ok[i]) ;
    Output[i][0] = new JTextField();
    Output[i][1] = new JTextField();
    Output[i][0].setEditable(false);
    Output[i][1].setEditable(false);
    Output[i][0].setHorizontalAlignment(JTextField.CENTER);
    Output[i][1].setHorizontalAlignment(JTextField.CENTER);
    B2[i].add(Output[i][0]);
    B2[i].add(Output[i][1]);
    A[i].add(B1[i]);
    A[i].add(B2[i]) ;
    c.add(A[i]) ;
    } //for i loop
    //D panel is where we store the answer[][]
    D1 = new JPanel();
    D1.setLayout(new GridLayout(1,6)) ;
    D2 = new JPanel();
    D2.setLayout(new GridLayout(1,2)) ;
    for (int j = 0; j <= Answer[0].length-1 ; j++)
    Answer[0][j] = new JTextField(0) ;
    Answer[0][j].setHorizontalAlignment(JTextField.CENTER);
    Answer[0][j].setEditable(false) ;
    D1.add(Answer[0][j]) ;
    Display.add(D1) ;
    Display.add(D2) ;
    c.add(Display) ;
    public void runClient()
         try
    {      socket=new Socket("localhost",8000);
    DataInputStream in=new DataInputStream(socket.getInputStream());
    int x=0;
    int o=0;
    try{
    while(true)
         while(trial_num<10)
              x=in.readInt();
              //System.out.println(x);
              Output[trial_num][0].setText(String.valueOf(x));
              o=in.readInt();
              //System.out.println(o);
              Output[trial_num][1].setText(String.valueOf(o));
              for(int i=0;i<6;i++)
              color[trial_num][i].setEnabled(false);
         ok[trial_num].setEnabled(false);
         trial_num++;
         col_now=0;
         if(x==6)
                   JOptionPane.showMessageDialog( null, "Congratulation, you've won the game !! " );
                   //ok[trial_num].setEnabled(false);
    break;
         if(trial_num<10)
         {  for(int i=0;i<6;i++)
              color[trial_num][i].setEditable(true);
              count[i]=5;
         ok[trial_num].setEnabled(true);
         if(x!=6)
         {  JOptionPane.showMessageDialog( null, "sorry you did not win the game");
         temp=in.readUTF();
         System.out.println(temp);
         //temp=in.readUTF();
         //System.out.println("can");
         for(int i=0;i<6;i++)
         System.out.println(i);
         char a=temp.charAt(i);
         int index=colorRange.indexOf(String.valueOf(a));
         Answer[0][i].setBackground(colorName[index]);
         trial_num=0;
         for(int j=0;j<10;j++)
         for(int k=0;k<6;k++)
         color[j][k].setBackground(Color.white);
         for(int j=0;j<10;j++)
         for(int k=0;k<2;k++)
         Output[j][k].setText(null);
         for(int i=0;i<6;i++)
              color[trial_num][i].setEditable(true);
              count[i]=5;
         ok[0].setEnabled(true);
         catch(EOFException em){}
         }catch(IOException ex){
              System.out.println("Error:"+ex.toString());}
    public void mouseClicked(MouseEvent e)
    for(int i=0;i<6;i++)
         if(e.getComponent()==color[trial_num][i])
         {         col_now=i;
         break;
    count[col_now]=(count[col_now]+1)%6;
    color[trial_num][col_now].setBackground(colorName[count[col_now]]);
    public void mouseEntered(MouseEvent e)
    public void mouseExited(MouseEvent e)
    public void mouseReleased(MouseEvent e)
    public void mousePressed(MouseEvent e)
    public void actionPerformed(ActionEvent e)
         try{
              send();
         }catch(IOException et){System.out.println("Error:"+et);}
    public void send()throws IOException
         DataOutputStream out=new DataOutputStream(socket.getOutputStream());
         char cbuf[]=new char[6];
         for(int i=0;i<6;i++)
              cbuf[i]=colorRange.charAt(count[i]);
    System.out.println(cbuf);
         out.writeUTF(new String(cbuf));
    /** Main method */
    public static void main(String[] args) {
    MasterMindClient frame = new MasterMindClient();
    frame.setTitle("Master Mind");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocation(300,300) ;
    frame.setSize(450, 450);
    frame.setVisible(true);
    frame.runClient();
    } // end of class

    I notice that you have several hundred lines of GUI code there. None of them have anything to do with the problem you are trying to solve. So put them all aside and write a SMALL test program that does nothing but the little loop you are having a problem with. Shouldn't be more than 20 lines of code.

Maybe you are looking for

  • Best way to  back up your data

    Which is the fastest and best way to back up your data in case of any problem ? Still to transfer to an external HD ? Thanks

  • Hyperlink in pdf is missing when run from server.

    Hello, I create a link for a field in a report (using Hyperlink tab Hyperlink information).  When I export the pdf from Crystal Report, I could see the link when mouse over the field.  But when I run the report from opendocumentfrom server) , the lin

  • How do I save documents from ipad to idisk without a pc/mac

    Im new to idisk and haven't a clue how to upload a file to it or a movie or music!!! Do I have to create the file on a pc? can i store my emails there? if so how would i upload my emails from the ipad to the idisk fro example? appreciate any interact

  • How can I extract maetrial condition (ME13)

    Hi, I need to extract data from transaction ME13, this transaction has any entries for validity periods of price and tax . Anybody konws how can I extract all validity periods of this conditions? Thanks, Cesar G. Batista

  • MM-Condition function

    Hi freinds, Do anybody know how to maintain MM-price condition under Logistic>Material Managements>Purchasing>Master Data>Conditions. I have 1 condition where our main vendor has giving us special discount for our difference branches. For example; if