Salve. Sto creando una chat client-server che per ora funziona solo in locale. Il problema è che all'atto della connessione del client al server, il client non riceve messaggi dal server. Il server sembra rilevare correttamente la connessione del client. Il codice non è breve, provo a mettere le parti più rilevanti (che comunque potrebbero essere utili a qualcuno).
Server
codice:
public class Server implements Runnable {
private List<ServerClient> clients = new ArrayList<ServerClient>();
private DatagramSocket socket;
private int port;
private boolean running = false;
private Thread run, manage, send, receive;
public Server(int port) {
this.port = port;
try {
socket = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
return;
}
run = new Thread(this, "Server");
run.start();
}
public void run() {
running = true;
System.out.println("Server started on port " + port);
manageClients();
receive();
}
private void manageClients() {
manage = new Thread("Manage") {
public void run() {
while(running) {
//niente per adesso
}
}
};
manage.start();
}
private void receive() {
receive = new Thread("Receive") {
public void run() {
while(running) {
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
try {
socket.receive(packet);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Ricevuto pacchetto da: " + packet.getAddress().toString() + " , " + packet.getPort());
process(packet);
}
}
};
receive.start();
}
private void process(DatagramPacket packet) {
String string = new String(packet.getData());
if(string.startsWith("/c/")) {
//UUID id = UUID.randomUUID();
int id = UniqueIdentifier.getIdentifier();
clients.add(new ServerClient(string.substring(3, string.length()), packet.getAddress(),
packet.getPort(), UniqueIdentifier.getIdentifier()));
System.out.println(string.substring(3, string.length()));
String ID = "/c/" + id;
send(ID, packet.getAddress(), packet.getPort());
} else if(string.startsWith("/m/")){
sendToAll(string);
} else if(string.startsWith("/d/")) {
String id = string.split("/d/|/e/")[1];
disconnect(Integer.parseInt(id), true);
}
else {
System.out.println(string);
}
}
private void disconnect(int id, boolean status) {
ServerClient c = null;
for(int i = 0; i < clients.size(); i++) {
if(clients.get(i).getID() == id) {
c = clients.get(i);
clients.remove(i);
break;
}
}
String message = "";
if(status) {
message = "Client " + c.getName() + " (" + c.getID() + ") @"
+c.getAddress().toString() + ":" + c.getPort() + " disconnected";
} else {
message = "Client " + c.getName() + " (" + c.getID() + ") @"
+c.getAddress().toString() + ":" + c.getPort() + " timed out";
}
System.out.println(message);
}
private void sendToAll(String message) {
for(int i = 0; i < clients.size(); i++) {
ServerClient client = clients.get(i);
send(message.getBytes(), client.getAddress(), client.getPort());
}
}
private void send(String message, InetAddress address, int port) {
message += "/e/"; //carattere di terminazione
send(message.getBytes(),address,port);
}
private void send(final byte[] data, final InetAddress address, final int port) {
send = new Thread("Send") {
public void run() {
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
System.out.println("Server is sending a packet to: " +
packet.getAddress() + " , " + packet.getPort());
try {
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
}
};
send.start();
}
}
ClientWindow
codice:
public class ClientWindow extends JFrame implements Runnable {
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JTextField txtMessage;
private JTextArea history;
private Client client;
private Thread listen, run;
private boolean running = false;
public ClientWindow(String name, String address, int port) {
setTitle("Client");
client = new Client(name, address, port);
boolean connect = client.openConnection(address);
if(!connect) {
System.err.println("Connection Failed");
console("Connection Failed");
}
createUI();
console("Attempting a connection to " + address + ":" + port + ", user: " + name);
String connection = "/c/" + name;
client.send(connection.getBytes());
running = true;
run = new Thread("Running Thread");
run.start();
}
private void createUI() {
//ho tolto per abbreviare
}
private void console(String message) {
history.append(message + "\n\r");
history.setCaretPosition(history.getDocument().getLength());
}
public void run() {
System.out.println("Client run() method");
listen();
}
private void send(String message, boolean text) {
if(message.equals("")) return;
if(text) {
message = client.getName() + ": " + message;
message = "/m/" + message;
}
client.send(message.getBytes());
txtMessage.setText("");
}
private void listen() {
System.out.println("Client listen() method");
listen = new Thread("Listen") {
public void run() {
while(running) {
String message = client.receive();
if(message.startsWith("/c/")) {
client.setID(Integer.parseInt(message.split("/c/|/e/")[1]));
console("Successfully connected to server. ID: " + client.getID());
} else if(message.startsWith("/m/")) {
String text = message.split("/m/|/e/")[1];
console(text);
}
}
}
};
listen.start();
}
}
Client
codice:
public class Client {
private String name, address;
private int port;
private DatagramSocket socket; //Protocollo UDP
private InetAddress ip;
private Thread send;
private int ID = -1;
public Client(String name, String address, int port) {
this.name = name;
this.address = address;
this.port = port;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public int getPort() {
return port;
}
public boolean openConnection(String address) {
try {
socket = new DatagramSocket();
ip = InetAddress.getByName(address);
} catch (UnknownHostException e) {
e.printStackTrace();
return false;
} catch (SocketException e) {
e.printStackTrace();
return false;
}
System.out.println("Client connection ok");
return true;
}
public String receive() {
byte[] data = new byte[1024]; //buffer dove riceviamo i dati
DatagramPacket packet = new DatagramPacket(data, data.length); //pacchetti UDP
System.out.println("Client is receiveing a packet from: " + packet.getAddress() + " , " + packet.getPort());
try {
socket.receive(packet); //riceviamo i pacchetti dal network
} catch (IOException e) {
e.printStackTrace();
}
String message = new String(packet.getData());
return message;
}
public void send(final byte[] data) {
send = new Thread("Send") {
public void run() {
DatagramPacket packet = new DatagramPacket(data, data.length, ip, port);
System.out.println("Client is sending a packet to: " + packet.getAddress() + " , " + packet.getPort());
try {
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
}
};
send.start();
}
public void close() {
new Thread() {
public void run() {
synchronized(socket) {
socket.close();
}
}
}.start();
}
public void setID(int ID) {
this.ID = ID;
}
public int getID() {
return ID;
}
}
In particolare la receive() della classe Client e la listen() della classe ClientWindow sembrano non funzionare.