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

server/2024/10/18 12:27:01/

功能一:模拟用户登录

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

这里设置的用户登录信息为: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();}
}

http://www.ppmy.cn/server/41191.html

相关文章

Sentinel-Dashboard安装

1. Docker官方镜像 找到跟你版本相对于的镜像进行拉取: https://hub.docker.com/r/bladex/sentinel-dashboard # 运行容器 Sentinel默认端口 8858 docker run --name sentinel-dashboard -p 8858:8858 -d bladex/sentinel-dashboard:1.8.6 &#xfeff…

(undone) 什么是马尔可夫链?Markov Chain

参考视频1:https://www.bilibili.com/video/BV1ko4y1P7Zv/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 参考视频2:https://www.bilibili.com/video/BV1xg4y1K7z4/?spm_id_from333.788&vd_source7a…

排序-插入排序的优化--半插入排序

半插入排序(有时也称为二分查找插入排序)是对传统插入排序的一种优化。基本思想是在执行插入操作时,不是简单地从前向后遍历已排序序列来寻找插入位置,而是使用二分查找法来确定新元素的正确位置,从而减少比较次数&…

OrangePi Zero2 全志H616开发学习文档、基础IO蜂鸣器、超声波测距、舵机PWM基础开发

一.平台介绍 OrangePi开发板不仅仅是一款消费品,同时也是给任何想用技术来进行创作创新的人设计的。它是一款简单、有趣、实用的工具,你可以用它去打造你身边的世界。 特性 CPU 全志H616四核64位1.5GHz高性能Cortex-A53处理器GPU MaliG31MP2 Supports…

OSPF综合实验(超详细易懂)(HCIP)

1、拓扑信息 2、需求分析 3、IP规划 4、配置 5、测试 1、拓扑信息 2、需求分析 R4为ISP,其上只能配置I地址; R4与其他所有直连设备间均使用公…

python从零开始学习深度学习01——神经网络反向传播的链式求导

自我介绍 最懂保险的算法工程师,致力于保险理念的推广,让每个程序员在35岁时都能够免除后顾之忧。通过构建保险组合,避免中年因病致穷,苦攒多年积蓄全部花费在医疗上,因此返贫。有兴趣的朋友后台私信加V:A…

springboot+excel导入导出相关

在我们日常研发工作中很多的地方需要用到导入导出excel的功能&#xff0c;在这里我将需要的代码进行总结方便自己也方便别人。 一、导出篇&#xff1a; 1.首先我们需要pom文件中配置上需要的maven包 <dependency><groupId>cn.afterturn</groupId><artifac…

如何解决NodeJS内存不足引起的程序崩溃问题?

当你的内存量不足&#xff08;比如云服务器上&#xff09;&#xff0c;可以给系统设置虚拟内存&#xff0c;然后用这个方法增加NodeJS可用内存量&#xff0c;以此解决内存不足而导致的程序崩溃问题。 具体的&#xff0c;就是使用--max-old-space-size参数来增加V8引擎的最大内…