Dit is een van mijn eerste projectjes in Java, en ik probeer een multithreaded socketserver te maken.
Ik loop enkel tegen wat probleempjes,
1: Wanneer een client de verbinding verbreekt, stop ik de while-lus, en haal ik de verbinding uit de connectionTable, echter blijft mijn thread nu nog levendig? En hoe zet ik die op stop?
2: Wanneer een client de verbinding verbreekt krijg ik een 'null', hij zegt "I Got: null" en de lijn eronder "Client dropped", normaal gezien wordt de while lus toch verbroken voordat hij aan I got geraakt.
3: Als ik iets stuur en druk op enter zegt hij "i got: ..." Dit is dus ok, maar wanneer ik de tweede maal wat stuur zegt hij niet, de derde maal zegt hij weer "i got:..." dus op de oneven verzonden berichten reageerd hij... Hoe komt dit?
Alvast bedankt voor de hulp!
Ik loop enkel tegen wat probleempjes,
1: Wanneer een client de verbinding verbreekt, stop ik de while-lus, en haal ik de verbinding uit de connectionTable, echter blijft mijn thread nu nog levendig? En hoe zet ik die op stop?
2: Wanneer een client de verbinding verbreekt krijg ik een 'null', hij zegt "I Got: null" en de lijn eronder "Client dropped", normaal gezien wordt de while lus toch verbroken voordat hij aan I got geraakt.
3: Als ik iets stuur en druk op enter zegt hij "i got: ..." Dit is dus ok, maar wanneer ik de tweede maal wat stuur zegt hij niet, de derde maal zegt hij weer "i got:..." dus op de oneven verzonden berichten reageerd hij... Hoe komt dit?
Alvast bedankt voor de hulp!
Code:
import java.net.*;
import java.io.*;
import java.util.*;
public class SocketServer
{
//Server Variables
static Vector connectionTable;
static int nextConnectionID = 1;
public SocketServer(int port)
{
ServerSocket socketServer = null;
Socket socket = null;
connectionTable = new Vector();
try
{
socketServer = new ServerSocket(port);
while ((socket = socketServer.accept()) != null)
{
ClientThread now;
Thread current = new Thread(now = new ClientThread(socket));
current.setDaemon(true);
connectionTable.addElement(now);
current.start();
}
}
catch (Exception e)
{
System.err.println(e);
System.exit(1);
}
}
}
class ClientThread extends Thread
{
//Thread Variables
private Socket linkTo; //The Socket
private int connectionID;
private String line;
public ClientThread(Socket from)
{
connectionID = SocketServer.nextConnectionID++;
linkTo = from;
System.out.println(linkTo);
System.out.println(connectionID);
ClientIn();
}
public void ClientIn()
{
while(true)
{
try
{
// Get input from the client
DataInputStream in = new DataInputStream (linkTo.getInputStream());
if(in.readLine() == null){
System.out.println("Client dropped!");
linkTo.close();
SocketServer.connectionTable.removeElement(this);
break;
//Client stoppen
}
else
{
System.out.println("I got:" + in.readLine());
}
} catch (IOException ioe) {
System.out.println("IOException on socket listen: " + ioe);
ioe.printStackTrace();
}
}
}
}