向服务器注册客户端 - Java套接字编程

3
我是socket编程的新手。我正在开发一个多客户端-服务器系统。在此期间,当客户端发送连接请求到服务器时,客户端需要注册他们的凭据。服务器将对其进行身份验证。
我已经阅读了一些有关客户端服务器编程的教程。我理解了套接字如何工作。但我的问题是,我应该怎么做来实现注册和身份验证?我可以只将用户名和密码作为消息发送到输出流中吗?还是有其他更好的方法来实现这一点?
请指导我如何实现这个功能?

除了在传输此类信息时应使用加密层之外,是的,您可以像发送任何数据一样发送凭据。 - etherous
1个回答

2

您可以像Web服务器一样通过维护会话来完成此操作。以下是步骤:

  1. 在第一次客户端连接时,客户端发送凭据对(用户名和密码)。
  2. 服务器接受并进行身份验证,如果验证成功,它会将其(用户名和密码)创建为哈希码,并添加到活动会话列表中,并将哈希会话返回给客户端。
  3. 在第二个或之后的请求上,客户端发送哈希会话,服务器检查该会话是否在活动会话列表中。

客户端代码:

Class Client
{
    private String uname;
    private String password;
    private String session;
    public String[2] message;
    //getter setter
}

//Inside Main Class
int sendInfo(String mesg)
{
    Client c=getClient(); //this function gives your Client Object with either session and username password etc preset,
    if(c.getSession()!==null || !c.getSession()!="")
    {
        c.message[0]=c.getSession(); //first String contains your session 
        c.message[1]=mesg;          //next string contains your message
    }
    else
    {
        c.message[0]=c.getUsername+"|"+c.getPassword(); //first String contains your session 
        c.message[1]=mesg;          //next string contains your message
    }
    sendMessageToServer(c.message);
}

服务器代码

Class Server
{
    private List<String> activeSession();
    //getter setter
    void addActiveSession(String session)
    {
        this.activeSession.add(session);
    }
    String generateSession(String uname,String password)
    {
        String sessionHash="RemoteSession"+this.activeSession.size()+uname+password;
        return sessionHash;
    }
    void serverReceive()
    {
        //Logic for listener
        String msg[]=getClientMessage();
        if(msg[0].indexOf('|')<0)
        {
            //it contains session. Check in activeSesion list           
        }
        else
        {
        //It cotains username & password separeted by |. Call Authenticate
            String 
        }
    }
    void authenticateConnection(String username,String pass)
    {
        if(checkUnameandPassword(username,pass))
        {
            //if the uname and pass is valid
            this.addActiveSession(generateSession(username,password))
        }
        else
        {
                sendConnectionrefuse();
        }
    }
}

希望这能帮到您。

我能够同时传输文件和认证信息吗? - new_learner
我猜是这样的,将通用数组放在0号索引中放置认证信息,在1号索引中设置文件流并将数组包装成对象并通过网络传输。在服务器端将对象强制转换为通用数组并获取认证信息以及文件流。我猜它会工作,但不确定是否百分之百正确。 - Kumar Gaurav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接