以一个小题目为例,一目了然。
题目描述
1.实现基于网络编程模式下的用户登录功能,要求:
(1)用户包含管理员和普通用户两个角色进行测试。
假定:管理员用户名:admin,密码:abc 普通用户名:user 密码:123
(2)用户从客户端发起登录请求,客户端将数据传递到服务器端,
由服务器做验证。服务器端保存用户数据。用户登录成功提示登录成功
并显示功能模块,登录失败提示:用户名或密码不正确。
思路
客户端与服务端双方数据传递建议使用类对象,所以主要写类对象在双方之间如何传递数据。
涉及Java序列化,因此编写的类要implements Serializable
客户端
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Task4_7_1_Client {
public static void main(String[] args) throws IOException {
Scanner input = new Scanner(System.in);
System.out.println("请输入用户名:");
String user = input.nextLine();
System.out.println("请输入密码:");
String password = input.nextLine();
input.close();
UserPw u = new UserPw(user,password);
//创建套接字
Socket client = new Socket("127.0.0.1",55555);
OutputStream os = client.getOutputStream();
//序列化
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(u);
// BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
// bw.write(user);
// //写入回车
// bw.write(13);
// bw.write(password);
// //刷新才能写入
// bw.flush();
System.out.println("客户端程序结束!");
client.close();
os.close();
oos.close();
}
}
class UserPw implements Serializable{
private String user;
private String password;
public UserPw(String user, String password) {
this.user = user;
this.password = password;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
服务端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Task4_7_1_Server {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//创建服务器并绑定端口号
ServerSocket server = new ServerSocket(55555);
System.out.println("服务器已成功启动!");
//等待客户端连接
Socket accept = server.accept();
System.out.println("一个客户端已成功连接!");
//接收
InputStream is = accept.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
//读出传入的对象
Object o = ois.readObject();
String user = null,password = null;
if (o instanceof UserPw){
UserPw up = (UserPw) o;
user = up.getUser();
password = up.getPassword();
}
// BufferedReader br = new BufferedReader(new InputStreamReader(is));
// String user = br.readLine();
// String password = br.readLine();
//System.out.println(user+" "+password);
if (user.equals("admin") && password.equals("abc")){
System.out.println("欢迎您,管理员!");
adminView();
}else if (user.equals("user") && password.equals("123")){
System.out.println("欢迎您,用户!");
userView();
}else{
System.out.println("用户名或密码不正确!无法登录!");
}
System.out.println("服务器端程序结束!");
accept.close();
is.close();
ois.close();
}
private static void userView() {
System.out.println("假设这是用户界面!....");
}
private static void adminView() {
System.out.println("假设这是管理员界面!....");
}
}
服务器这一块常用多线程,就是在服务端new Thread(){}重写run方法,.start()调用即可,用new的线程来和客户端交互,这里不再单独改为多线程了。
另外,传字符串也可以解决这个问题,在代码块中的注释部分,也可以看一下,写入的时候用回车隔开,读的时候直接readLine()即可获得数据。