Witam

Piszę aplikacje serwera oraz klienta komunikatora internetowego z użyciem bazy danych w SQLight. Jako że wcześniej mało się bawiłem w komunikacje TCP/IP mam pewne problemy. Otóż nie mogę znaleźć przyczyny niepoprawnego działania następującego kodu:

Główna klasa serwera:

package server;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import java.io.*;
import java.net.*;

public final class Server 
{
	
	/**
	 * @param args port number
	 */

	
	public static void main(String[] args) throws IOException
	{
		//List<User> users = new LinkedList();
		
		boolean running = true;
		
		ServerSocket serverSocket = null;
		
		if(args.length != 1)
		{
			System.out.println("Wrong argument number, please specify port...");
			
			System.exit(1);
		}
		
		try 
		{
		    serverSocket = new ServerSocket(Integer.parseInt(args[0]));
		} 
		catch (IOException e) 
		{
		    System.out.println("Could not listen on port: " + Integer.parseInt(args[0]));
		    System.exit(-1);
		}
		
		System.out.println("Running...");
		
		while(running)
		{
			new ServerThread(serverSocket.accept()).start();
		}
		
		serverSocket.close();

	}

}

**
Klasa wątku serwera:**

package server;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import java.io.*;
import java.net.*;

public final class ServerThread extends Thread
{
	public ServerThread(Socket socket)
	{
		super("Server thread");
		
		this.socket = socket;
	}
	
	public void run()
	{
		try
		{
			PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
			
			BufferedReader in = new BufferedReader(
				    new InputStreamReader(
				    socket.getInputStream()));
			
			String inputLine, outputLine;
			
			String username, password, ip;
			
			String toUsername, message;
			
			ip = socket.getInetAddress().getHostAddress();
			
			inputLine = in.readLine();
			
			while(inputLine != "!Login!" || inputLine != "!Register!")
			{
				if(inputLine == "Logout" || inputLine == "Exit") Thread.currentThread().interrupt();
			}
			
			if(inputLine == "!Register!")
			{
				while(true)
				{
					username = in.readLine();
					
					password = in.readLine();
					
					if(!User.exists(username))
					{
						User.create(username, password);
						
						out.println("Created");
						
						break;
					}
					else
					{
						out.println("User already exists...");
					}
				}
			}
			
			while(true)
			{
				username = in.readLine();
				
				password = in.readLine();
				
				if(User.exists(username))
				{
					User.login(username, password, ip);
					
					out.println("Ok");
					
					break;
				}
				else
				{
					out.println("Error");
				}
			}
			
			while((inputLine = in.readLine()) != "!Logout!")
			{
				if(inputLine == "!Message!")
				{
					StringBuilder stringBuilder = new StringBuilder();
					
					toUsername = in.readLine();
					
					while((inputLine = in.readLine()) != "!End!")
					{
						stringBuilder.append(inputLine);
					}
					
					message = stringBuilder.toString();
					
					User.sendMessage(username, toUsername, message);
				}
				
				if(inputLine == "!Online!")
				{
					String onlineUsername;
					
					while(inputLine != "!End!")
					{
						onlineUsername = in.readLine();
						
						out.println(User.online(onlineUsername));
					}
				}
				
				if(inputLine == "!GetMessages!")
				{
					List<Message> messages = User.getMessages(username);
					
					for(Message m : messages)
					{
						out.println(m.getFromUsername());
						out.println(m.getMessage());
						out.println("!End!");
					}
					
					out.println("!EndMessages!");
				}
			}
			
			in.close();
			
			out.close();
			
			socket.close();
		}
		catch(IOException e)
		{
			e.printStackTrace();
		}
	}
	
	private Socket socket = null;
}

Główna klasa klienta

package client;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import java.io.*;
import java.net.*;

public final class Client 
{
	public static void main(String[] args) throws IOException
	{
		Socket clientSocket = null;
		
		PrintWriter out = null;
		
		BufferedReader in = null;
		
		boolean running = true;
		
		
		
		
		if(args.length != 2)
		{
			System.out.println("Wrong argument number, specify host and port...");
			
			System.exit(1);
		}
		
		try
		{
			System.out.println("1");
		
			clientSocket = new Socket(args[0], Integer.parseInt(args[1]));
			
			System.out.println("2");
			
			out = new PrintWriter(clientSocket.getOutputStream(), true);
			
			System.out.println("3");
			
            in = new BufferedReader(new InputStreamReader(
                                        clientSocket.getInputStream()));
            
            System.out.println("4");
		}
		catch(UnknownHostException e)
		{
			System.err.println("Can't resolve host: " + args[0]);
                    									
			System.exit(1);
		}
		catch (IOException e) 
		{
            System.err.println("Couldn't get I/O for " + "the connection to: " + args[0] + " on port " + args[1]);
            System.exit(1);
        }
		
		
		Protocol.register("testowy", "hasloo", in, out);
		
		clientSocket.close();
		

	}

}

Metoda Protocol.register:


public static boolean register(String username, String password, BufferedReader in, PrintWriter out)
	{
		out.println("!Register!");
		
		out.println(username);
		
		out.println(password);
		
		try
		{
			if(in.readLine() == "User already exists...") return false;
		}
		catch(IOException e)
		{
			e.printStackTrace();
		}
		
		return true;
	}

Większość jest robiona trochę na żywca bez uprzedniej znajomości TCP/Ip więc proszę o wyrozumiałość
Metody klasy User działają (przynajmniej login, create,...) więc nie tu problem.
Wszystko w Eclipse, mam dwie paczki w projekcie client oraz sever.
W jednej klasa Server w drugiej Client
Biorę Run As wybieram Server jako main z parametrem 7000
Potem Run As i wybieram Client z parametrami localhost 7000

Z góry dziękuje za pomoc i uwagi co robię źle

P.S Zapomniałem dodać że proces klienta potrafi zużycwać 30-40% CPU, nieraz więcej. Nie wiem czemu (Nie dochodzi do System.exit(-1) przez metodę register? Wydaje mi się że to problem z synchronizacją out serwera i in klienta której tutaj nie pojmuje)