Server and multiple sockets
I'm a student, trying to write a server that can handle multiple
clients. It's closer to working than I was expecting but if I use
client 1, then client 2, client 1 then freezes. And then I can't close
the windows and have to stop the OS processes. The problem occurs with
this statement after port is defined:
ServerSocket ss = new ServerSocket(port);
which causes this message:
java.net.BindException: Address already in use: JVM_Bind
At that point no clients are running and nothing else has happened
with ports. I actually don't understand why the clients work at all,
since the socket doesn't seem to have been created successfully. After
the message above (and a trace), no other system messages appear
unless I try to close a window.
The following code includes comments using caps and ***, showing where
the trouble occurs. Any help greatly appreciated.
Chris
________________________________
package com.abc.server;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class Server extends JPanel implements Runnable {
private static JTextArea serverLog;
private static int port;
private static Socket soc;
private static ObjectOutputStream oos;
private static ObjectInputStream ois;
private Thread internalThread;
private static PrintStream out;
public static void main(String[] args) {
JFrame f = new JFrame("Server");
f.setSize(600, 350);
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
f.setVisible(true);
serverLog = new JTextArea();
f.add(serverLog);
out = new PrintStream(new TextAreaOutputStream(serverLog));
System.setOut(out);
System.setErr(out);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
try {
ois.close();
oos.flush();
oos.close();
soc.close();
} catch ( IOException ioe ) {
System.out.println(ioe + "\n");
ioe.printStackTrace();
}
System.exit(0);
}
});
port = 2001;
Server server = new Server();
System.out.println("Leaving main.");
}
public Server() {
internalThread = new Thread(this);
internalThread.start();
}
public void run() {
System.out.println("Server ready.");
int i = 1;
System.out.println("Start of ");
try {
System.out.println("Start of connecting section. i = " +
i);
// *** EXECUTES CORRECTLY TO HERE
ServerSocket ss = new ServerSocket(port);
// *** MESSAGE ISSUED HERE BUT SOCKET PARTIALLY WORKS
for ( ;; ) {
Socket sock = ss.accept();
System.out.println("Got connection #" + i);
ClientService cs = new ClientService(sock, i,
out);
i++ ;
}
} catch ( IOException ioe ) {
System.out.println(ioe + "\n");
ioe.printStackTrace();
}
// *** FOLLOWING PRINTS CORRECTLY BUT NO OTHER MESSAGES
System.out.println("Connection established.");
}
}
class ClientService implements Runnable {
private static ObjectOutputStream oos;
private static ObjectInputStream ois;
private Thread internalThread;
private Socket soc;
private int counter;
public ClientService(Socket s, int ctr, PrintStream outTxtArea) {
soc = s;
counter = ctr;
PrintStream out = outTxtArea;
System.setOut(out);
System.setErr(out);
internalThread = new Thread(this);
internalThread.start();
internalThread.interrupt();
}
public void run() {
System.out.println("Thread for client #" + counter);
try {
final InputStream is = soc.getInputStream();
oos = new ObjectOutputStream(soc.getOutputStream());
ois = new ObjectInputStream(is);
boolean done = false;
while ( !done ) {
String strFrmClnt = (String) ois.readObject();
String strToClnt = strFrmClnt.length() + " - " +
strFrmClnt;
if ( strFrmClnt == null ) {
done = true;
} else {
oos.writeObject(strToClnt);
}
}
ois.close();
oos.flush();
oos.close();
soc.close();
} catch ( ClassNotFoundException cnfe ) {
System.out.println(cnfe + "\n");
cnfe.printStackTrace();
} catch ( IOException ioe ) {
System.out.println(ioe + "\n");
ioe.printStackTrace();
}
}
}