2011-03-16 15 views
5

मैं वर्तमान में डेस्कटॉप ऐप के लिए प्रमाणीकरण सर्वर बनाने के लिए जावा के साथ खेल रहा हूं और अब तक मैं क्लाइंट और सर्वर दोनों को शुरुआत के लिए चैट सर्वर/क्लाइंट की तरह संवाद करने में सक्षम हूं।सॉकेट प्रमाणीकरण सर्वर?

मुझे एहसास है कि मुझे केवल इसका एक छोटा सा हिस्सा मिल रहा है और सीखने और सीखने के लिए कई चीजें हैं लेकिन अभी इस चरण में मैं सोच रहा हूं कि प्रमाणीकरण कैसे किया जाता है।

उदाहरण के लिए, इस सर्वर कोड है:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class LoginServer 
{ 
    public static void main(String[] args) throws Exception { 
     int port = 7000; 
     int id = 1; 

     ServerSocket loginserver = null; 
     try 
     { 
      loginserver = new ServerSocket(port); 
      System.out.println("LoginServer started..."); 
     } 
     catch (IOException e) { 
      System.out.println("Could not listen on port: " + port); 
      System.exit(-1); 
     } 

     while (true) 
     { 
      Socket clientSocket = loginserver.accept(); 
      ClientServiceThread cliThread = new ClientServiceThread(clientSocket, id++); 
      cliThread.start(); 
     } 
    } 
} 

class ClientServiceThread extends Thread 
{ 
    Socket clientSocket; 
    int clientID = -1; 
    boolean running = true; 

    ClientServiceThread(Socket s, int i) 
    { 
     clientSocket = s; 
     clientID = i; 
    } 

    public void run() 
    { 
     System.out.println("Accepted Client : ID - " + clientID + " : Address - " + clientSocket.getInetAddress().getHostName()); 
     try 
     { 
      BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
      PrintWriter out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream())); 
      while (running) 
      { 
       String clientCommand = in.readLine(); 
       System.out.println("Client Says :" + clientCommand); 
       if (clientCommand.equalsIgnoreCase("quit")) 
       { 
        running = false; 
        System.out.print("Stopping client thread for client : " + clientID); 
       } 
       else 
       { 
        out.println(clientCommand); 
        out.flush(); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

आप देख सकते हैं, मैं पढ़ा करते हैं ग्राहक क्या भेजता है और कंसोल के लिए यह उत्पादन के साथ-साथ जाँच अगर ग्राहक भेजा है एक से बाहर निकलें या आदेश नहीं

  • मैं क्या सोच रहा हूँ कि कैसे मैं ताकि ग्राहक केवल कनेक्ट कर सकते हैं यह करने के लिए उपयोगकर्ता और पासवर्ड भेजा गया था, तो क्या करना होगा है?

  • या मैं हमेशा प्रारंभिक कनेक्शन और वहाँ से प्राप्त करना चाहिए प्रमाणीकरण जानकारी प्राप्त करते हैं और उस में मान लीजिए कि 3 सेकंड उन्हें डिस्कनेक्ट जाने भेजा अगर ग्राहक नहीं है?

  • नए कनेक्शन प्राप्त करने और को इसके साथ उपयोगकर्ताओं को प्रमाणीकृत करने का सही तरीका क्या है?

उत्तर

10

आपको सही विचार है, लेकिन आपको इसे राज्य मशीन के रूप में और अधिक सोचने की आवश्यकता है।

एक ग्राहक कनेक्ट करता है, तो उसे लॉगिन स्थिति में जाना होगा, जहां आप इसकी प्रमाणीकरण जानकारी भेजने की अपेक्षा करते हैं। यदि गलत या टाइमआउट, डिस्कनेक्ट करें।

यदि सही है, तो कमांड प्रोसेसिंग स्थिति पर जाएं। अगर आपको एक छोड़ने का आदेश मिलता है, तो या तो क्लीनअप स्थिति पर जाएं, या बस डिस्कनेक्ट करें।

String line; 
while ((line = in.readLine()) != null) { 
    switch (state) { 
     case login: 
      processLogin(line); 
      break; 
     case command: 
      processCommand(line); 
      break; 
    } 
} 

आपका processLogin समारोह ऐसा दिखाई दे सकता:

void processLogin(String line) { 
    if (user == null) { 
     user = line; 
    } 
    else if (password == null) { 
     password = line; 
    } 
    else { 
     if (validUser(user, password)) { 
      state = command; 
     } 
     else { 
      socket.close(); 
     } 
    } 
} 

और अपने processCommand समारोह:

void processCommand(String line) { 
    if (line.equals(...)) { 
     // Process each command like this 
    } 
    else if (line.equals("quit")) { 
     socket.close(); 
    } 
    else { 
     System.err.println("Unrecognized command: " + line); 
    } 
} 

state उदाहरण चर की संभावना होगी

यहाँ एक सामान्य रूपरेखा है एक enum। आप देख सकते हैं कि इस मॉडल का उपयोग करके आपको कुछ सरल सरलता मिल जाएगी। उदाहरण के लिए, एक कमांड आपको विशिष्ट उप-आदेशों को संसाधित करने के लिए किसी भिन्न स्थिति में छोड़ सकता है।

+0

आपके उत्तर के लिए धन्यवाद मुझे खुशी है कि मैं बहुत दूर नहीं था, मैंने प्रमाणीकरण सॉकेट सिस्टम के लिए सीधे किसी भी स्रोत या उदाहरणों के लिए चारों ओर देखने की कोशिश की लेकिन मुझे कोई उदाहरण नहीं मिला और इस पर मेरी सहायता करनी होगी, क्या आप मुझे एक छोटा कोड नमूना देने में सक्षम हो सकता है शायद मुझे किसी भी लिंक पर निर्देशित करें जो कि लॉगिन मशीन के लिए राज्य मशीन के संबंध में जांच के लायक हो सकता है या इसी तरह से बाहर निकलने में मदद कर सकता है? धन्यवाद आप एक बार फिर – Guapo

+0

वास्तव में समय लेने के लिए सराहना करते हैं यह वास्तव में मेरी मदद करता है;) – Guapo