I’ve recently gotten into trying to make server-client connections. I was able to make a 1 on 1 connection with no problems, but now i’m trying to make a server that accepts multiple clients and i’m running into a problem where i can’t make the server listen to connections while there is one established… I’m not sure if i made myself clear but here’s my code:
-The main loop that waits for connections:
public class ChatMultiServer {
public static void main(String []args){
int socknum = 124;
ServerSocket serverSocket;
Socket clientSocket;
while(true){
////opens socket
try{
System.out.println("Opening port...");
new ServerSocket(124).close();
serverSocket = new ServerSocket(socknum);
}catch(Exception e){System.out.println("Error 101 = failed to bind to port "+socknum+"."); break;}
//////accepts connection
try{
System.out.println("Waiting for connections...");
clientSocket = serverSocket.accept();
}catch(Exception e){System.out.println("Error 102 = failed to accept port "+socknum+"."); break;}
/////
try{
System.out.println("Initializing thread...");
new Thread(new CMSThread(clientSocket));
}catch(Exception e){System.out.println("Error 103 = failed to create thread."); break;}
try{
serverSocket.close();
}catch(Exception e){System.out.println("Error 105 = failed to close socket.");}
}
}
}
-The thread that handles the connections:
public class CMSThread extends Thread{
Socket socket;
BufferedReader in;
PrintWriter out;
String username;
char EOF = (char)0x00;
public CMSThread(Socket s){
socket = s;
run();
}
public void run(){
try{
System.out.println("Setting up streams...");
in = (new BufferedReader(new InputStreamReader(socket.getInputStream())));
out = new PrintWriter(socket.getOutputStream());
}catch(Exception e){System.out.println("Error 204 = failed to get streams");}
try{
out.print("Welcome! you can quit at any tyme by writing EXIT.\nLet me introduce myself, I'm 'testprogram 1', but that doesn't really matter since you'll do the talking.\nWhat's your name?"+EOF);
out.flush();
username = in.readLine();
out.print("<b>"+username+"</b>, that's a nice name.\nWell, i'll shut up now. Have fun talking to yourself while whoever is running the server observes your conversation.\n"+EOF);
out.flush();
}catch(Exception e){System.out.println("Are you effin kidding me!? -.- whatever... Error 666 = failed to chat.");}
}
}
My problem, once again, is that when the server gets a connection with a client(I’m using actionscript for the clients just because it’s easier to make a GUI), it just waits until the thread is done running to start the loop again. I’m trying to make it loop at the same time as the thread handles the chat.
I was thinking maybe i needed to make a thread for the loop as well as the thread for handling the connection, but i’m not sure as to how i would go about doing that… Please let me know if my hypothesis was somewhat right, and if it was, some guidance towards the answer would be nice.
PS: I’m sorry if my code is a bit messy or if this is a stupid question, i haven’t made a java program in a while…
You aren’t actually starting your new Threads – you are just directly calling
run(). As far as I can see, this means that you will be executingrun()in the main thread that creates each CMSThread object.To start a Thread, you have to call
thread.start().Also, I’m not sure why you are wrapping your CMSThread in another Thread – CMSThread extends Thread so it can be started in its own right. The wrapper Thread isn’t being started either.
So you need:
and remove the
run()call from the constructor ofCMSThread