网络编程——Socket——模拟用户登录

功能一:模拟用户登录

功能二:实现客户发送登录用户信息,服务器端显示登录信息并响应给客户端登录成功

这里设置的用户登录信息为:admin,123456

实现:

1.首先,服务端创建并启动服务器,并开放一个端口给客户端----服务端

ServerSocket serverSocket = new ServerSocket(1111);

Socket socket = serverSocket.accept();

2.在客户端创建Socket并连接到服务器----客户端

Socket socket = new Socket("127.0.0.1", 1111);

3.在客户端初始化输出流,用于向服务端发送数据----客户端

OutputStream os = socket.getOutputStream();

4.在客户端进行登录----客户端

System.out.println("------用户登录-------");

System.out.print("请输入用户名:");

String username = sc.nextLine();

System.out.print("请输入密码:");

String password = sc.nextLine();

5.将用户输入信息封装为User对象,并将其序列化发送给服务器,发送后关闭输出流,发送完成信号----客户端

User user = new User(username, password);

ObjectOutputStream oos = new ObjectOutputStream(os);

oos.writeObject(user);

socket.shutdownOutput();

6.在服务端打开输入流,接收客户端发送过来的数据流----服务端

InputStream is = socket.getInputStream();

7.在服务端,将输入流包装成对象输入流,用于读取序列化对象,并读取客户端传来的User对象----服务端

ObjectInputStream ois = new ObjectInputStream(is);

User user = (User) ois.readObject();

8.服务端接收到用户登录信息后进行打印,并验证----服务端

System.out.println("服务器端:接收到用户登录请求:用户名:" + user.getUsername()

  • ",密码:" + user.getPassword());

String msg = null;

if ("admin".equals(user.getUsername()) && "123456".equals(user.getPassword())){

System.out.println("服务器端:用户登录成功");

// 设置成功登录的消息,向客户端发送消息

msg ="欢迎【" + user.getUsername() + "】登录成功";

}else {

System.out.println("服务器端:用户登录失败");

// 设置登录失败的消息

msg ="用户名或密码错误,请重新登录";

}

9.在服务端进行验证后,将结果发送个客户端----服务端

OutputStream os = socket.getOutputStream();

os.write(msg.getBytes());

10.客户端正在等待服务器的响应----客户端

InputStream is = socket.getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(is));

String line = null;

while ((line = br.readLine()) != null) {

System.out.println("服务器端:" + line);

}

11.别忘了最后要进行关闭哦

结果

先运行服务端在运行客户端

客户端运行结果:

服务端运行结果:

完整代码

客户端:

复制代码
public class LoginClient {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        // 创建Socket连接到服务器
        Socket socket = new Socket("127.0.0.1", 1111);

        //打开输出流,初始化输出流,用于向服务器发送数据
        OutputStream os = socket.getOutputStream();

        ObjectOutputStream oos = new ObjectOutputStream(os);

        // 用户登录界面交互
        System.out.println("------用户登录-------");
        System.out.print("请输入用户名:");
        String username = sc.nextLine();
        System.out.print("请输入密码:");
        String password = sc.nextLine();
        // 将用户输入封装为User对象
        User user = new User(username, password);

        // 将User对象序列化并发送给服务器
        oos.writeObject(user);
        // 关闭输出流,发送完成信号
        socket.shutdownOutput();

        //等待、接受服务器响应
        InputStream is = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String line = null;
        while ((line = br.readLine()) != null) {
            System.out.println("服务器端:" + line);
        }

        //关闭输入流
        br.close();
        is.close();
        os.close();
        socket.close();
    }
}

服务端:

复制代码
public class LoginServer {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 创建并启动服务器,监听1111端口
        ServerSocket serverSocket = new ServerSocket(1111);
        Socket socket = serverSocket.accept();

        //打开输入流,接收客户端发送过来的数据流
        InputStream is = socket.getInputStream();
        // 将输入流包装成对象输入流,用于读取序列化对象
        ObjectInputStream ois = new ObjectInputStream(is);
        // 读取客户端传来的User对象
        User user = (User) ois.readObject();

        // 打印接收到的用户登录信息
        System.out.println("服务器端:接收到用户登录请求:用户名:" + user.getUsername()
                + ",密码:" + user.getPassword());

        String msg = null;
        // 验证用户登录信息
        if ("admin".equals(user.getUsername()) && "123456".equals(user.getPassword())){
            System.out.println("服务器端:用户登录成功");
            // 设置成功登录的消息,向客户端发送消息
            msg ="欢迎【" + user.getUsername() + "】登录成功";
        }else {
            System.out.println("服务器端:用户登录失败");
            // 设置登录失败的消息
            msg ="用户名或密码错误,请重新登录";
        }
        // 获取输出流,向客户端发送消息
        OutputStream os = socket.getOutputStream();
        // 将消息转换为字节流并发送
        os.write(msg.getBytes());
        // 关闭相关资源
        os.close();
        ois.close();
        is.close();
        socket.close();
        serverSocket.close();
    }
}
相关推荐
风翼靓崽11 分钟前
linux命令杂记 - 杂乱无章
linux·运维·服务器
xixixi7777718 分钟前
全模态原生大脑降临:GPT-5.5(Spud)发布,推理/编码提升30%,百万上下文+原生电脑控制,开启Agent新纪元
大数据·网络·人工智能·gpt·安全·电脑·量子计算
solihawk20 分钟前
服务器内存被谁“偷”走了?
服务器·数据库
我爱C编程26 分钟前
基于WSN无线传感器网络的定向步幻影路由算法matlab仿真
网络·matlab·无线传感器网络·wsn·定向步幻影路由
域中四大41 分钟前
rk3568中修改波特率
linux·运维
互联网推荐官42 分钟前
大模型应用开发的上下文工程与推理链路深度拆解
大数据·运维·人工智能
风曦Kisaki1 小时前
# Linux Shell 编程入门 Day01:Shell 基础认知、脚本编写规范、变量四大类型、数值运算
linux·运维·chrome
德彪稳坐倒骑驴1 小时前
SQL连续登录问题
服务器·数据库·sql
云智慧AIOps社区1 小时前
云智慧亮相第二十八届智能体驱动的GOPS全球运维大会2026 · 深圳站!以运维智能体 Castrel AI (SRE Agent)保障系统稳定可靠!
运维·人工智能·ai agent·运维自动化·sre 智能体
校羽干1 小时前
ubuntu22.04 安装卸载更新 ollama
运维·服务器