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
ClientWindowcodice: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(); } }
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
In particolare la receive() della classe Client e la listen() della classe ClientWindow sembrano non funzionare.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; } }

Rispondi quotando