题目:模拟网站的登录,客户端录入账号密码,然后服务器端进行验证(TCP)(完善)

完善(加入完整的处理异常的方式、多线程接收用户请求)(TCP)

封装的类

package com.gao.Project.Pro5;

import java.io.Serializable;

public class User implements Serializable {
    private static final long serialVersionUID = -2201118496650087459L;
    //快捷键Alt+Enter---->选第一个
    //如果没有出现,需设置
    //File-->Settings--->Inspections--->Serializable class without 'serialVersionUID'--->勾选--->OK
    private String name;
    private String pwd;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public User(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }
}

线程

package com.gao.Project.Pro5;

import java.io.*;
import java.net.Socket;

public class ServerTread extends Thread {//
    InputStream is = null;
    ObjectInputStream ois = null;
    OutputStream os = null;
    DataOutputStream dos = null;
    Socket s = null;
    public ServerTread(Socket s){
        this.s=s;

    }
    @Override
    public void run() {
        try {

            is = s.getInputStream();
            ois = new ObjectInputStream(is);

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

            boolean flag = false;
            if(user.getName().equals("甜甜")&&user.getPwd().equals("12323")){
                flag = true;
            }

            //向客户端输出一句话:---->操作流---->输出流
            os = s.getOutputStream();
            dos =new DataOutputStream(os);
            dos.writeUTF("你好,我是服务器端,我接收到你的请求了");

        }catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }finally {
            try {
                if(dos!=null){
                    dos.close();
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(os!=null){
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(is!=null){
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

客户端

package com.gao.Project.Pro5;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class TestClient {//客户端
    public static void main(String[] args){
        Socket s = null;
        OutputStream os  = null;
        InputStream is= null;
        ObjectOutputStream oos = null ;
        DataInputStream dis = null;
        try {
            //录入用户的账号密码:
            s = new Socket("192.168.2.142",8888);
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入您的账号:");
            String name = sc.next();
            System.out.println("请输入您的密码:");
            String pwd = sc.next();
            //将账号和密码封装成User的对象:
            User user = new User(name,pwd);

            //2.对于程序员来说,向外发送数据  感受--->利用输出流
            os = s.getOutputStream();
            oos = new ObjectOutputStream(os);
            oos.writeObject(user);

            //接收服务器端的回话--->利用输入流:
            is = s.getInputStream();
            dis = new DataInputStream(is);
            boolean b = dis.readBoolean();
            if(b){
                System.out.println("登录成功");
            }else {
                System.out.println("登录失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //3.关闭流  +   关闭网络资源:
            try {
                if(dis!=null){
                    dis.close();
                }
            } catch (IOException e) {
               e.printStackTrace();
            }
            try {
                if(is!=null){
                    is.close();
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(oos!=null){
                    oos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(os!=null){
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(s!=null){
                    s.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

服务器端

package com.gao.Project.Pro5;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TestServer {//服务器

    public static void main(String[] args){
        System.out.println("服务器已启动");
        ServerSocket ss = null;
        Socket s = null;
        int count = 0;//定义一个计算器,用来记录客户端的请求
        try {
            ss = new ServerSocket(8888);
            while (true){//加入死循环,服务器一直监听客户端是否发送数据
                s = ss.accept();
                //每次过来的客户端的请求  靠  线程处理:
                new ServerTread(s).start();
                count++;
                System.out.println("当前是第"+count+"个用户访问服务器,访问的用户是:"+s.getInetAddress());
            }
        } catch (IOException e) {
          e.printStackTrace();
        }

    }
}

Original: https://www.cnblogs.com/gaoxiaocuo/p/16712629.html
Author: 进步+吃饭
Title: 题目:模拟网站的登录,客户端录入账号密码,然后服务器端进行验证(TCP)(完善)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/572634/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Windows 资源管理器 CPU100%

    Windows 资源管理器 CPU100% win + R打开运行框并输出:services.msc 点击确定打开服务;将服务中的Problem Reports Control P…

    Java 2023年6月14日
    0101
  • 剑指面向对象

    一、面向过程和面向对象 1.1、面向过程 1.2、面向对象 二、变量 2.1、变量的分类 2.2、变量的初始值 2.3、变量的作用域 2.4、变量的生命周期 三、类 3.1、类的定…

    Java 2023年6月7日
    074
  • 标识符命名、instanceof 、自动装箱与拆箱、java关键字

    标识符的命名规则 标识符的含义: 是指在程序中,我们自己定义的内容,譬如, 类的名字, 方法名称以及 变量名称等等,都是标识符。 命名规则:(硬性要求) 标识符可以包含英文字母,0…

    Java 2023年6月13日
    088
  • Spring系列18:Resource接口及内置实现

    Java 的标准 java.net.URL 类和各种 URL 前缀的标准处理程序不足以满足所有对低级资源的访问。 例如没有标准化的 URL 实现可用于访问需要从类路径或相对于 Se…

    Java 2023年6月5日
    067
  • spring循环依赖的产生与解决

    1.循环依赖的产生 在spring中对象默认都是单例的 ,意味整个容器中只有一个该类的对象。 如图,B类有一个属性a,A类有一个属性b。当B类创建对象时,要给a属性赋值;当A类创建…

    Java 2023年6月8日
    073
  • springboot发送邮件

    springboot发送邮件 简化版: 1.pom.xml引入依赖 <!– e-mail–> <dependency> <groupid>c…

    Java 2023年6月15日
    050
  • 常用API(Java)

    Object 场景:当我们使用toString方法想要输出对象变量时,官方提供的toString方法会直接输出对象所在的地址,而不是我们想要的对象变量,所以我们要把toString…

    Java 2023年6月6日
    086
  • spring boot 返回 JSON 数据

    在 WEB 项目中返回 JSON 数据是常见的交互形式 1.添加依赖 2.定义返回方式 在 Controller 类上面用 @RestController 定义或者在方法上面用 @…

    Java 2023年5月30日
    083
  • OO 第三单元总结

    OO 第三单元总结 OO 第三单元总结 规格的阅读与实现心得 JML的阅读方法 JML迭代 测试数据与JML 容器的选择 算法和性能分析 Network 扩展考虑 题目要求 架构分…

    Java 2023年6月13日
    082
  • Java数组-2022年4月17日

    ArrayList概念:一个连续的空间,存储多个相同数据类型的值特点:1. 类型相同2. 长度固定数组的创建 数组类型[] 数组名 = new 数组类型[数组长度]; //长度大小…

    Java 2023年6月5日
    079
  • 介绍几个好用的工具类

    The end is also the new beginning 最近真的是忙的飞起啊!!年前还得更新一个版本,啊难受啊…趁今天有空,上来冒个泡😆 好,入正题,今天介…

    Java 2023年6月13日
    081
  • JavaSE_多线程入门 线程安全 死锁 状态 通讯 线程池

    对JavaSE_多线程入门 线程安全 死锁 状态 通讯 线程池进行简要总结 1 多线程入门 1.1 多线程相关的概念 并发与并行 并行:在同一时刻,有多个任务在多个CPU上同时执行…

    Java 2023年6月9日
    082
  • 本文章内容主要摘选自《Java核心技术卷II》 是一种概念,也可以看作一种管道,连接着内存与硬盘(或其他媒介) 相对程序而言,输入流是把外部媒介的数据传输到内存的对象,而输出则是到…

    Java 2023年6月5日
    065
  • 数据结构总结

    数据结构是指存在特定相互关系的数据元素的集合。元素之间的相互关系称为数据的逻辑结构,数据元素及元素之间关系的存储称为存储结构或物理结构。通常情况下,精心选择的数据结构可以带来更高的…

    Java 2023年6月7日
    079
  • 深入理解CAS思想之原子操作类详解

    前置知识(CAS部分) (1)什么是 CAS 1.CAS(Compare And Swap,比较并交换),通常指的是这样一种原子操作: 针对一个变量,首先比较它的内存值与某个期望值…

    Java 2023年6月16日
    069
  • 全面了解 Java 原子变量类

    一、原子变量类简介 保证线程安全是 Java 并发编程必须要解决的重要问题。Java 从原子性、可见性、有序性这三大特性入手,确保多线程的数据一致性。 确保线程安全最常见的做法是利…

    Java 2023年5月29日
    0113
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球