Getting two different classes/programs interacting

For an AI program I am making I need to get two programs interacting - I am doing this by using sockets and a threads.

This program is a smaller version of th AI program. There are two of these programs - opposites i.e. where one says female the other says male and so on.

Ok this is what should happen:

-Program starts and background threads starts with it (always reading input).

-Command is issued by the other program ("mate").

-This triggers the connect() method which sends a command to the other program (action triggered) therefore they have interacted.

Please give me any hints as to why this does not work.

Thanks
John

import java.util.Scanner;
import java.util.Vector;
import java.util.Random;
import java.io.*;
import java.net.ConnectException;
import java.net.ServerSocket;
import java.net.Socket;
 
//set path="C:\Program Files\Java\jdk1.5.0_08\bin"
 
public class AIPetTest
{
      public Socket socket = null;
      public String command = "";
      public static Vector<String> commands = null;
      public String line = null;
 
      public String start()
      {
            backgroundThread.start();
 
            Scanner command = new Scanner(System.in);
            String commandIssued = command.nextLine();
 
            if(commandIssued.equals("mate"))
            {
                  try
                  {
                        connect("mate");
                  }
                  catch(Exception e)
                  {
                        System.err.println("Caught Exception: " + e.getMessage());
                  }
            }
            return null;
      }
 
      public void connect(String update) throws Exception
      {
            System.out.println(update);
 
          try
          {
                  System.out.println("Connection made");
                socket = new Socket("localhost", 1977); // throws Exception below, if no connection is possible
 
          }
          catch(ConnectException ce)
          {
                System.out.println("Connection lost");
                socket = new ServerSocket(1977).accept();
                // no connection was possible, so make app server
                //socket = new ServerSocket(1977).accept();
                // be aware that accept is blocking!
            }
 
            command = commands.remove(0);  // Take the 1st object out
 
            System.out.println("Command: " + command);
 
            if(command.equals("updateMale")) // incoming
            {
                  System.out.println("Mating");
            }
 
 
            socket.getOutputStream().write(("updateFemale").getBytes());
 
            //socket.close();
    }
 
    Thread backgroundThread = new Thread(new Runnable() // reads all incoming messages and stores them in a vector
    {
          public void run()
          {
                  System.out.println("Thread running");
 
                  commands = new Vector<String>();
                  try
                  {
                        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
 
                        while(true)
                        {
                               line = in.readLine();
 
                               if(line == null)
                               {
                                     break; // out of the while
                               }
 
                               commands.add(new String(line + '\n'));
                        }
                        in.close();
                  }
                  catch(IOException ioe)
                  {
                        System.err.println("Caught Exception: " + ioe.getMessage());
                  }
          }
    });
 
      public static void main(String[] args)
      {
            AIPetTest pet = new AIPetTest();
            pet.start();
      }
}
john8932Asked:
Who is Participating?
 
marchentConnect With a Mentor Commented:
i think this is a client side program, did u implemented a serverside program for this code? otherwise u have to implement the serverside code.

>>BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
socket.getInputStream() returns null, so null pointer exception.
0
 
marchentCommented:
>>socket.getOutputStream().write(("updateFemale").getBytes());

OutputStream os = sock.getOutputStream();
PrintWriter pw = new PrintWriter(os,true);
pw.println("...");

the true inside the PrintWriter constructor will autoflush the output.

~marchent~
0
 
john8932Author Commented:
What does the autoflush do?

Do you suggest I replace the code you mentioned?

I forgot to say that when I run this I always get this exception although the  program carries on and allows me to enter the mate command which then gives another exception:

Thread running
Exception in thread "Thread-0" java.lang.NullPointerException
        at AIPetTest2$1.run(AIPetTest2.java:84)
        at java.lang.Thread.run(Thread.java:595)

mate
mate
Connection made
Caught Exception: Array index out of range: 0

Cheers
0
 
john8932Author Commented:
I think I will simplify this so that one program is the server - always listening for a command, and one is the client. It runs second. It connects then it sends a command.

If you can get the other way working i.e. connect both ways alternatively then please do as this would be better.

This is a client side program.

Thanks
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.