Vários clientes acessam o servidor simultaneamente

Estou tendo uma canvas de login e agora digo que temos 2 usuários com nome de usuário: amit e ajay e sua senha: “pass” e “word” .Agora eu quero que suponha que sejam dois aplicativos de desktop abertos no mesmo sistema.Eu quero que múltiplos os clientes acessam o servidor simultaneamente.

Significado dizer em uma canvas de login amit insere o nome de usuário e, em seguida, seu segmento deve dormir e na segunda canvas de login deixe ajay digite seu nome de usuário, em seguida, amit novamente digite sua senha depois que ajay digite sua senha.Como fazer isso em java?

Aqui estou compartilhando um ótimo Client Server Authentication Application com um servidor que está se comunicando com vários clientes usando o protocolo TCP conforme sua necessidade.

Responda:

Aqui cada cliente está conectado em um thread separado do servidor e esse segmento contém todas as informações sobre o cliente. Isso resolverá seu problema de simultaneidade.


Veja os comentários em linha para mais esclarecimentos.

Nota: substitua o nome do host no arquivo LiveChatClient.java antes de executar este programa na porta no 1234

Etapas para executar o programa:

  • Primeiro, execute o LiveChatServer apenas por uma única vez
  • Em seguida, execute LiveChatClient para vários clientes quantos você deseja adicionar

Aqui está mais uma amostra no mesmo contexto. Por favor, dê uma olhada no Java Server com comunicação Multiclient.


Opcode.java:

Código de operação usado para definir um protocolo de comunicação entre cliente e servidor

 /**************** an interface to define different operation code **************/ public interface Opcode { int CLIENT_USERNAME = 1; int CLIENT_INVALID_USERNAME = 2; int CLIENT_PASSWORD = 3; int CLIENT_INVALID_PASSWORD = 4; int CLIENT_CONNECTED = 5; } 

LiveChatServer.java:

Único servidor que controla vários clientes

 /************************ Live Chat Server *******************/ import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.HashMap; import java.util.LinkedHashMap; public class LiveChatServer { // Connection state info private static LinkedHashMap clientInfo = new LinkedHashMap(); // TCP Components private ServerSocket serverSocket; // Main Constructor public LiveChatServer() { startServer();// start the server } public void startServer() { String port = "1234"; try { // in constractor we are passing port no, back log and bind address whick will be local // host // port no - the specified port, or 0 to use any free port. // backlog - the maximum length of the queue. use default if it is equal or less than 0 // bindAddr - the local InetAddress the server will bind to int portNo = Integer.valueOf(port); serverSocket = new ServerSocket(portNo, 0, InetAddress.getLocalHost()); System.out.println(serverSocket); System.out.println(serverSocket.getInetAddress().getHostName() + ":" + serverSocket.getLocalPort()); while (true) { Socket socket = serverSocket.accept(); new ClientThread(socket); } } catch (IOException e) { System.out.println("IO Exception:" + e); System.exit(1); } catch (NumberFormatException e) { System.out.println("Number Format Exception:" + e); System.exit(1); } } public static HashMap getClientInfo() { return clientInfo; } // *********************************** Main Method ******************** public static void main(String args[]) { new LiveChatServer(); } } 

LiveChatClient.java:

Vários clientes conectados ao servidor único

 /************************ Live Chat Client *******************/ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.SocketException; public class LiveChatClient { private String chatName; private String password; private String serverAddress; // TCP Components private Socket socket; private BufferedReader in; private PrintWriter out; public LiveChatClient() { initHostName(); runClient();// have fun } public void initHostName() { try { serverAddress = ""; if (serverAddress == null) System.exit(1); serverAddress = serverAddress.trim(); if (serverAddress.length() == 0)// empty field { System.out.println("Server IP Address or Name can't be blank."); initHostName(); return; } System.out.println("Trying to connect with server...\nServer IP Address:" + serverAddress); // create socket InetAddress inetAddress = InetAddress.getByName(serverAddress); if (!inetAddress.isReachable(60000))// 60 sec { System.out .println("Error! Unable to connect with server.\nServer IP Address may be wrong."); System.exit(1); } initPortNo(); } catch (SocketException e) { System.out.println("Socket Exception:\n" + e); initHostName(); return; } catch (IOException e) { initHostName(); return; } } public void initPortNo() { try { String portNo = "1234"; portNo = portNo.trim(); if (portNo.length() == 0)// empty field { System.out.println("Server port No can't be blank."); initPortNo(); return; } System.out.println("Trying to connect with server...\nServer Port No:" + portNo); socket = new Socket(serverAddress, 1234); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(), true); } catch (IOException e) { System.out.println("IO Exception:\n" + e); initPortNo(); return; } } public void sendChatName() throws IOException { System.out.println("Enter user name:"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String name = br.readLine(); if (name == null) System.exit(1); // title case (get only first 9 chars of chat name) chatName = name.trim(); if (name.length() == 0) { System.out.println("Please enter user name."); sendChatName(); return; } // sending opcode first then sending chatName to the server out.println(Opcode.CLIENT_USERNAME); out.println(chatName); } public void sendPassword() throws IOException { System.out.println("Enter password:"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String name = br.readLine(); if (name == null) System.exit(1); // title case (get only first 9 chars of password) password = name.trim(); if (name.length() == 0) { System.out.println("Please enter password."); sendPassword(); return; } // sending opcode first then sending password to the server out.println(Opcode.CLIENT_PASSWORD); out.println(password); } public void runClient() { try { sendChatName(); while (true) { int opcode = Integer.parseInt(in.readLine()); switch (opcode) { case Opcode.CLIENT_INVALID_USERNAME: // this client is connecting System.out.println(chatName + " is invalid user name. Try different one."); sendChatName(); break; case Opcode.CLIENT_PASSWORD: sendPassword(); break; case Opcode.CLIENT_INVALID_PASSWORD: // this client is connecting System.out.println(password + " is invalid password. Try different one."); sendPassword(); break; case Opcode.CLIENT_CONNECTED: System.out.println(chatName + " is connected successfully."); break; } } } catch (IOException e) { System.out.println("Client is closed..."); } } // *********************************** Main Method ******************** public static void main(String args[]) { new LiveChatClient(); } } 

ClientThread.java:

Encadeamento múltiplo iniciado pelo servidor um para cada cliente e contendo informações sobre todos os clientes conectados

 /************************ Client Thread *******************/ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.HashMap; import java.util.Map; public class ClientThread implements Runnable { // TCP Components private Socket socket; private BufferedReader in; private PrintWriter out; private String chatName; private String password; // seperate thread private Thread thread; // boolean variable to check that client is running or not private volatile boolean isRunning = true; // opcode private int opcode; private static Map userpass = new HashMap(); static { userpass.put("amit", "pass"); userpass.put("ajay", "word"); } public ClientThread(Socket socket) { try { this.socket = socket; in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(), true); thread = new Thread(this); thread.start(); } catch (IOException e) { System.out.println(e); } } public void run() { try { while (isRunning) { if (!in.ready()) continue; opcode = Integer.parseInt(in.readLine());// getting opcode first from client switch (opcode) { case Opcode.CLIENT_USERNAME: chatName = in.readLine(); System.out.println(chatName + " is reqesting to connect."); boolean result1 = userpass.containsKey(chatName); if (result1) { System.out.println(chatName + " is a valid username."); out.println(Opcode.CLIENT_PASSWORD); } else { System.out.println(chatName + " is a invalid username."); out.println(Opcode.CLIENT_INVALID_USERNAME); } break; case Opcode.CLIENT_PASSWORD: password = in.readLine(); System.out.println(chatName + " is reqesting to connect having password " + password); boolean result2 = userpass.get(chatName).equals(password); if (result2) { System.out.println(password + " is a valid password for username " + chatName); out.println(Opcode.CLIENT_CONNECTED); } else { System.out.println(password + " is a invalid password for username " + chatName); out.println(Opcode.CLIENT_INVALID_PASSWORD); } break; } } // close all connections out.close(); in.close(); socket.close(); } catch (IOException e) { System.out.println(e); } } } 

Aqui está a saída quando dois clientes são adicionados.

Servidor:

 ServerSocket[addr=computerName/14.98.241.102,port=0,localport=1234] computerName:1234 abc is reqesting to connect. abc is a invalid username. ajay is reqesting to connect. ajay is a valid username. ajay is reqesting to connect having password word word is a valid password for username ajay amit is reqesting to connect. amit is a valid username. amit is reqesting to connect having password word word is a invalid password for username amit amit is reqesting to connect having password pass pass is a valid password for username amit 

Cliente1: (ajay)

 Trying to connect with server... Server IP Address:computerName Trying to connect with server... Server Port No:1234 Enter user name: abc abc is invalid user name. Try different one. Enter user name: ajay Enter password: word ajay is connected successfully. 

Cliente2: (amit)

 Trying to connect with server... Server IP Address:computerName Trying to connect with server... Server Port No:1234 Enter user name: amit Enter password: word word is invalid password. Try different one. Enter password: pass amit is connected successfully. 

Use este programa como inicial para o seu aplicativo. Por favor, deixe-me saber se você deseja adicionar novas funcionalidades no programa.

Pode ser que você deva considerar o estudo JavaEE, você está dizendo é basicamente o trabalho que faz os servidores. Onde cada cliente está conectado ao servidor para fazer um login. Agora, se você precisa fazer 100% desktop no javaSE, você precisa de threads, onde cada thread irá se conectar ao login local.

JavaEE: http://www.roseindia.net/quickguide/tomcat/Logout.shtml

Tópicos: http://www.vogella.com/tutorials/JavaConcurrency/article.html

Espero que ajude !!