JAVA远程验证账号密码的方法

C/S模式
客户端在服务器上验证账号密码
我的想法是
客户端于服务器间建立socket连接
服务器使用DataInputStream获得客户端传送过来的信息
服务器端:
ServerSocket ssk = ServerSocket(1234);
Socket sk = ssk.accept();
DataInputStream usr = new DataInputStream(sk.getInputStream());
String userName = usr.readUTF();
String passWord = urs.readUTF();
............//之后与数据库做比较

问题在这,这样的话就硬性地规定了客户端只能按顺序地输入账号和密码, 如果网路出现阻塞的话,可能密码先到达,这样就出现错误了,请问有其他更好的方法来传送具体的信息吗,如账号、密码、性别之类的,因为我想再做一个客户端注册用户的功能。

这个么 呵呵。socket通信不要直接使用输入输出流,在输入输出流的外面包装一层对象流,不论到什么时候都要记得,java是面向对象的语言,所谓一切皆对象,出处都要使用面向对象的思维考虑问题。
服务器端:
建立一个User的pojo类(简单对象模型,只有属性和get,set方法),里面封装User对象的数据库中的主键(这个可选,如果要映射数据库的话最好加上)用户名,密码,权限标志。代码如下:
一定要注意 一定要注意 一定要注意 一定要注意 一定要注意
此处一定要注意,对象必须实现序列化,即实现Serializable接口,然后使用生成serialVersionUID(必须的,socket同学传递对象必须实现序列化的对象才能反序列化)。

package com.comment.model;

/**
* Users entity. @author MyEclipse Persistence Tools
*/

public class User implements java.io.Serializable {

private static final long serialVersionUID = 8820751056579395747L;
private Integer userId;
private String username;
private String password;
private String flag;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}

}

然后客户端可以这样
将用户信息封装到user对象
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setFlag(flag);
将封装好的对象传入服务器端。
Socket toServer = new Socket(ip, port);
ObjectOutputStream streamToServer = new ObjectOutputStream(toServer.getOutputStream());
streamToServer.writeObject( user);

服务器端
首先要讲客户端的User类复制过来(当然在一个项目里没这必要,我通常写在两个项目里)。
其次:
ServerSocket ssk = ServerSocket(port);
Socket sk = ssk.accept();

ObjectInputStream fromClient = new ObjectInputStream(sk.getInputStream());

Object obj = (Object) fromClient.readObject();
//这里User类要写全路径 比如 com.User
if(obj.getClass().getName().equals("User"){
User user=(User)obj;
//可以直接执行登陆逻辑了。login(user);
//也可以 String userName = user.getUsername();
// String passWord = user.getPassword();

}

其实socket通信还有好多问题要考虑,比如阻塞问题啦,安全问题啦等等,楼主先搞懂socket通信的基本原理和方法再往深了想吧.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-06-15
这样的情况不会发生滴。先不说两条数据会不会分成两个报文发送出去,就算是两个报文,编号高的报文就算先接受到,编号低的报文提交给程序之前,编号高的报文不会提交给程序的
第2个回答  2010-06-15
一个比较简单的方法是,你可以把这些帐户,密码,性别 等数据都放在一个字符串中,中间用一个特殊符号如$来分割他们 然后再服务端做字符串的分割就好了,这样你的问题就都解决了.

参考资料:大脑

第3个回答  2010-06-16
对三楼大哥深表崇拜~~
原来我做的时候一直用户名密码分开传,自己玩截包工具都能弄到用户名密码,怎么就木有想到先包装成对象呢呵呵~~

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网