I work on a project to make a chat app using udp (datagramsockets) in java. the idea is multiple clients can communicate with each other with intermediate a server, server here get message from client1 and send to the destination, and this destination can answer to client1. so each client can write messages and recieve messages without having none block. THREAD SEND:
package org.example.Client;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;
public class Send extends Thread{
DatagramSocket datagramSocket;
Scanner clavier = new Scanner(System.in);
Client client;
String operation;
public Send(DatagramSocket socket, Client client,String operation){
this.datagramSocket = socket;
this.client = client;
this.operation = operation;
}
@Override
public void run() {
System.out.println("Send ... ");
String msg=null;
byte[] tampon;
System.out.println("DESTINATAIRE : ");
String destinataire = clavier.nextLine();
do {
tampon = new byte[1024];
msg = clavier.nextLine();
try {
tampon =(operation+"|"+destinataire+"|"+client.username+"|"+msg).getBytes();
DatagramPacket packet = new DatagramPacket(tampon,tampon.length, InetAddress.getByName("localhost"),1234);
datagramSocket.send(packet);
System.out.println("SEND ....");
//datagramSocket.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}while(msg!=null);
}
}
Thread recieve:
package org.example.Client;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Recieve extends Thread{
DatagramSocket datagramSocket;
public Recieve(DatagramSocket socket){
this.datagramSocket=socket;
}
@Override
public void run() {
System.out.println("Recieve ...,");
while (true){
byte[] tampon = new byte[1024];
DatagramPacket packet = new DatagramPacket(tampon,tampon.length);
try {
datagramSocket.receive(packet);
System.out.println("RECIEVE .....");
System.out.println("REcieve || "+packet.getPort()+ " || "+new String(packet.getData()));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
Client:
package org.example.Client;
import org.example.ConnexionDb.ConnexionDb;
import org.example.GUI.ConnexionForm;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;
public class Client {
String username;
public DatagramSocket datagramSocket;
public Client(String username){
this.username = username;
try {
datagramSocket = new DatagramSocket();
} catch (SocketException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) throws Exception{
Scanner clavier = new Scanner(System.in);
//new ConnexionForm();
System.out.println("Connexion Nouveau Utilisateur: ");
//Connection à la base de données:
ConnexionDb connexionDb = new ConnexionDb();
boolean isConnected = false;
while (!isConnected){
System.out.println("Username: ");
String username = clavier.nextLine();
System.out.println("Password: ");
String password = clavier.nextLine();
if(connexionDb.connexionUtilisateur(username,password)==1){
System.out.println("Connexion avec succé");
Client client = new Client(username);
DatagramSocket socket = new DatagramSocket();
byte[] tampon = ("1|"+client.username).getBytes();
DatagramPacket packet = new DatagramPacket(tampon,tampon.length, InetAddress.getByName("localhost"),1234);
socket.send(packet);
socket.close();
System.out.println("1- Envoyer un message\n" +
"2- Les utilisateurs connectés");
String choix = clavier.nextLine();
isConnected = true;
switch (choix){
case "1":
//Client client = new Client(username);
//DatagramSocket socket = new DatagramSocket();
Send send = new Send(client.datagramSocket, client,"2");
send.start();
Recieve recieve = new Recieve(client.datagramSocket);
recieve.start();
break;
case "2":
break;
}
}
else {
System.out.println("Vérifier vos informations et réassayer.");
}
}
}
}
Server:
package org.example.Serveur;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.ArrayList;
public class Serveur extends Thread{
DatagramSocket datagramSocketClient;
DatagramSocket datagramSocketServer;
int port;
byte[] tampon;
ArrayList<ConnectedUsers> connectedUsers = new ArrayList<>();
public Serveur(int port){
this.port = port;
}
@Override
public void run() {
System.out.println("Serveur ... ");
while(true){
try {
datagramSocketServer = new DatagramSocket(port);
tampon = new byte[1024];
DatagramPacket packet = new DatagramPacket(tampon, tampon.length);
datagramSocketServer.receive(packet);
System.out.println("Message recu : " + packet.getPort() + " || " + new String(packet.getData()));
datagramSocketServer.close();
String[] recieved = (new String(packet.getData(),0,tampon.length).trim()).split("[|]");
System.out.println("apres close: " + packet.getPort());
datagramSocketClient = new DatagramSocket();
InetAddress inetAddress = InetAddress.getByName("localhost");
switch (recieved[0]){
case "1":
connectedUsers.add(new ConnectedUsers(recieved[1],packet.getPort(),packet.getAddress()));
System.out.println("New USER CONNECTED "+recieved[1]);
break;
case "2":
System.out.println("FROM-->"+recieved[2]+" To-->"+recieved[1]+" ::: "+recieved[3]);
int port = 0;
InetAddress inetAddress1 = null;
for(int i=0; i<connectedUsers.size();i++){
if(connectedUsers.get(i).username.equals(recieved[1])){
port = connectedUsers.get(i).port;
inetAddress1 = connectedUsers.get(i).inetAddress;
}
}
tampon = (recieved[2]+" :::: "+recieved[3]).getBytes();
DatagramPacket packet1 = new DatagramPacket(tampon,tampon.length,inetAddress1,port);
datagramSocketClient.send(packet1);
System.out.println("Envoyé au destinataire::: ");
break;
}
//DatagramPacket packet1 = new DatagramPacket(tampon, tampon.length,inetAddress,destPort);
datagramSocketClient.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
public static void main(String[] args) {
Serveur serveur = new Serveur(1234);
serveur.start();
}
public class ConnectedUsers{
int port;
InetAddress inetAddress;
String username;
public ConnectedUsers(String username, int port, InetAddress inetAddress){
this.port = port;
this.username = username;
this.inetAddress = inetAddress;
}
}
}
Server works good. The problem is on client: when I run Client, I authenticate client the problem is here recieve don't let send to finish. I want to have possibility to send message and recieve without block between those two threads.
Thread send = new Send(client.datagramSocket, client,"2");
send.start();
Thread recieve = new Recieve(client.datagramSocket);
recieve.start();