user1174834
user1174834

Reputation: 249

Read Multiple Input from same line.

I am working on a simple tcp chat server in java. The user can type in commands like "push:", "get", "adios","help" etc . . . I check for these user commands by setting String Line = input.readLine() (shown below). The problem is when I type "push: " I must go to a new line to get new input and assign it to a new string. I want to be able to get input on the same line after the user types the command.

For example: if USER 1 types in "push: " + "Hello, how are you today?" I want to store "Hello, how are you today?" to an array so I can print its contents later. But as it is now I must type "push: " go to a new line and type "Hello, how are you today?" to store it to the array. That's just awkward. Is there any way to store the input to two different strings on the same line?

Here is my server code, check the run method

// Chat Server runs at port no. 9020
import java.io.*;
import java.util.*;
import java.net.*;
import static java.lang.System.out;

public class  TCPServer 
{
  Vector<String> users = new Vector<String>();
  Vector<HandleClient> clients = new Vector<HandleClient>();
  Vector<String> Chat = new Vector<String>();

  int PORT = 9020;
  int NumClients = 10;

  public void process() throws Exception  
  {
      ServerSocket server = new ServerSocket(PORT,NumClients);
      out.println("Server Connected...");
      while(true) 
      {
         Socket client = server.accept();
         HandleClient c = new HandleClient(client);
         clients.add(c);
     }  // end of while
  }

  public static void main(String ... args) throws Exception 
  {
      new TCPServer().process();
  } // end of main

  public void boradcast(String user, String message)  
  {
        System.out.println(user + ": " + message);
        // send message to all connected users
        for (HandleClient c : clients)
           if (!c.getUserName().equals(user))
           {
              c.sendMessage(user,message);
           }
  }

  class HandleClient extends Thread 
  {
    String name = "";
    BufferedReader input;
    PrintWriter output;

    public HandleClient(Socket client) throws Exception 
    {
          // get input and output streams
         input = new BufferedReader(new InputStreamReader(client.getInputStream())) ;
         output = new PrintWriter (client.getOutputStream(),true);
         output.println("Welcome to Alan's Chat Server!\n");
         // read name
         output.println("Please Enter a User Name: ");
         name  = input.readLine();
         users.add(name); // add to vector
         output.println("\nWelcome "+name+" we hope you enjoy your chat today");
         start();
    }

    public void sendMessage(String uname,String  msg)  
    {
        output.println( uname + ": " + msg);
    }

    public String getUserName() 
    {  
        return name; 
    }

    public void run()  
    {
         String line;
         try    
         {
            while(true)   
            {
                        line = input.readLine();
            line.toLowerCase();//check this
                if("adios".equals(line))
            {
                output.println("\nClosing Connection  . . . Goodbye");
                            clients.remove(this);
                        users.remove(name);
                break;
                    }
            else if(name.equals(line))
            {
                            output.println("OK");
                    }
            else if("help".equals(line))
            {
                output.println("\nServer Commands:" + "\n\"audios:\" close the client connection\n"+
                                               "\"Name:\" display \"OK\"\n");//Check this
            }
            else if("push: ".equals(line))
            {
                String NewLine = input.readLine();
                Chat.add(NewLine);
                output.println("OK");
            }
            else if("get".equals(line))
            {
                output.println(Chat.toString());

            }
            else
            {
                    boradcast(name,line); // method  of outer class - send messages to all
            }
            }// end of while
         } // try
         catch(Exception e) 
         {
           System.out.println(e.getMessage());
         }
    } // end of run()
  } // end of inner class
} // end of Server

Upvotes: 1

Views: 3063

Answers (2)

Mob
Mob

Reputation: 11106

Possible with String.split("") or using the StringTokenizer Class

String line = input.read();
String [] d = s.split(":",2);

access the values via the array indices;

Edit:

For clarity I'm passing 2 as the second argument in the split method, because, it limits the split a array to just two indices so you don't have 3 arrays for something like this:

String.split("PUSH: I am hungry :P"); as it would output [PUSH; I am hungry; P]

Upvotes: 1

Usman Ismail
Usman Ismail

Reputation: 18679

line = input.readLine();
line.toLowerCase();//check this
....
else if("push: ".equals(line))
.....

Should be

line = input.readLine();
String command = line.split(":")[0];
String otherStuff = line.split(":")[1];
command.toLowerCase();//check this
....
if("push".equals(command));
.....

Upvotes: 1

Related Questions