Reputation: 249
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
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
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