如何利用Java Socket编写一个C/S的口令认证小程序

这两天要编写一个客户端和服务器端的口令认证小程序,就是提供用户名和密码,然后连接到服务器那种,基本上算是一个聊天程序,其中的一个问题是在聊天之前要进行一下认证。问题:客户... 这两天要编写一个客户端和服务器端的口令认证小程序,就是提供用户名和密码,然后连接到服务器那种,基本上算是一个聊天程序,其中的一个问题是在聊天之前要进行一下认证。

问题:客户端发送过来的密码服务器端要进行一些计算,然后在发送给客户端,客户端在进行计算,然后再发回来,这样往复几步之后才能进行实际消息的护发。
这个C/S的信息自动交互,也就是在客户端第一次发送密码的时候,双方自动进行多次的信息的发送和验证,在socket上怎么实现呢?自己写了一些代码,出现了被阻塞的问题,就是只能发送一步信息就不能继续了。

所以想问一下各位高人,小弟非常感谢!悬赏积分已经设为最高了,对能给小弟一些指点的高手,真的非常感谢!
具体遇到的困难就是不知道如何通过socket信息传输,来处理我的程序中的信息交互。利用Java来编写的整体的思想感觉很不清晰。
如:在客户端的GUI上填入用户名密码IP地址之类,然后点击登陆,信息就发到服务器端了么,服务器自行处理这个密码数据,把处理的结果自动发回客户端,客户端自动的再进一步处理,再自动的发回服务器。这种机制我不知道如何利用Java来处理。
展开
 我来答
beyondts
2009-04-30 · TA获得超过262个赞
知道答主
回答量:178
采纳率:0%
帮助的人:0
展开全部
服务端要建立一个ServerSocket
public class Server {
private int port;
private boolean running;

public Server(int port) {
this.port = port;
this.running = false;
}

public void start() {
try{
ServerSocket server = new ServerSocket(port);
}catch(Exception ex) {
//记录日志
System.exit(1);
}
running=true;
while(running) {
Socket client = server.accept();
//ClientHandler 是业务处理线程
ClientHandler handler = new ClientHandler(client);
handler.start();
}
}

//为running提供get/set方法
}

public class ClientHandler extends Thread {
private Socket client;
public ClientHandler(Socket client) {
this.client=client;
}

public void run() {
PrintWriter pw = new PrintWriter(new OutputStreamWriter(client.getOutputStream()), true);
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));

pw.println("connect successfully");
String buf = null;
//约定好第一次发用户名,第二次发密码
buf = br.readLine();
String user = buf;
buf=br.readLine();
String pwd = buf;
if (authen(user, pwd)) {//验证用户
pw.println("passed");

while((buf = br.readLine()) != null) {
//消息交互
}

} else {
pw.println("unpassed");
pw.pringln("exit");//向客户端发送关闭连接的指令
buf = br.readLine();
if ("exit".equals(buf)) {
client.close();
}
}
}
}

客户端开始时先尝试与服务器建立连接,一旦连接建立会收到服务器发送的消息"connect successfully",然后让用户输入用户名密码,用户点登录按钮后,第一次发送用户名,第二发密码到服务端认证,服务端通过认证会发"passed",不通过会发"unpassed",并同时发"exit"指令,客户端收到exit指定后发关闭连接请求,并关闭连接, 以上指令格式需要事先约定好,最好用到一些特殊字符以区别普通消息

客户端程序我就不提供了,你自己考虑下吧,有不明白的再问
书荒莫慌
2009-04-30 · TA获得超过2972个赞
知道小有建树答主
回答量:700
采纳率:0%
帮助的人:524万
展开全部
服务器端不是在监听么,给他一个标志为,每次收到的时候加1,如果初始为0的话,需要和客户端2次交互也就是标志为变为2的时候才真正开始接受客户端发送的消息了。

或者你给最开始跟密码认证有关的消息加一个特殊的头部不就行了么,其他的只不过是正常的socket编程了。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
20808301a
2009-04-29 · TA获得超过534个赞
知道小有建树答主
回答量:276
采纳率:0%
帮助的人:259万
展开全部
你所说的就是口令牌,
设计逻辑应该和struts的口令牌一样,可以借鉴下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qinghua9
2009-04-29 · TA获得超过1679个赞
知道大有可为答主
回答量:6101
采纳率:0%
帮助的人:2341万
展开全部
听你的功能,并不是很难,如有问题,可以讲讲具体碰到的困难,以便于帮你解决
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式