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)