实操七

作者: 上杉丶零 | 来源:发表于2019-05-08 16:28 被阅读0次

知识点范围:多线程和网络编程

一、选择题

  1. 以下选项中可以填写到横线处,让代码正确编译和运行的是( A )。(选择1项)
public class Test implements Runnable {
    public static void main(String[] args) {
        ___________________________________
        t.start();
        System.out.println("main");
    }

    public void run() {
        System.out.println("thread1!");
    }
}
    • A:Thread t = new Thread(new Test());
    • B:Test t = new Test();
    • C:Thread t = new Test();
    • D:Thread t = new Thread();

解析:

  • 线程创建的方式之一就是实现Runnable接口,此接口只有一个抽象方法run(),启动线程又需要start()方法,所以还需要借助Thread类,根据Thread类的构造方法Thread(Runnable run),需要传入Runnable接口对象。
  1. 如下代码创建一个新线程并启动线程,问:四个选项中可以保证正确代码创建target对象,并能编译正确的是( C )。(选择1项)
public static void main(String[] args) {
    Runnable target=new MyRunnable( );  
    Thread myThread=new Thread(target); 
}
    • A:
public class MyRunnable extends Runnable {
    public void run()  {}
}
    • B:
public class MyRunnable extends Runnable {
    void run()  {}
}
    • C:
public class MyRunnable implements Runnable {
    public void run()  {}
}
    • D:
public class MyRunnable implements Runnable {
    void run()  {}
}

解析:
线程创建的方式之一就是实现Runnable接口,此接口只有一个抽象方法run()。子类重写的方法的权限必须大于等于父类方法权限(除去private外)。

  1. 当线程调用start( )后,其所处状态为( C )。(选择1项)
    • A:阻塞状态
    • B:运行状态
    • C:就绪状态
    • D:新建状态

解析:
线程的五个状态也就是它的生命周期:

  1. 新建状态:通过new关键字来创建线程对象
  2. 就绪状态:调用start()方法
  3. 运行状态:调用run()方法
  4. 阻塞状态:调用sleep()、wait()、join() 、yield()、interrupt ()等方法
  5. 消亡状态:调用stop()方法,但是此方法已经过时
  1. 下列关于Thread类提供的线程控制方法的说法中,错误的是( C )。(选择1项)
    • A:线程A中执行线程B的join()方法,则线程A等待直到B执行完成
    • B:线程A通过调用interrupt()方法来中断其阻塞状态
    • C:若线程A调用方法isAlive()返回值为false,则说明A正在执行中,也可能是可运行状态
    • D:currentThread()方法返回当前线程的引用

解析:
isAlive()方法判断一个线程是否在活动,如果在活动则返回true,未活动则返回false。

  1. 下列关于线程的优先级说法中,正确的是( CD )。(选择2项)
    • A:线程的优先级是不能改变的
    • B:线程的优先级是在创建线程时设置的
    • C:在创建线程后的任何时候都可以重新设置
    • D:线程的优先级的范围在1-10之间

解析:
线程的优先级可以在创建线程后的任何时候通过setPriority(int newPriority)方法进行设置,线程的优先级的范围在1-10之间,最低优先级为1,最高优先级为10,但是有一点,即使设置为最高优先级也不一定先执行,只是被选中执行的概率比较高

  1. 以下协议中属于TCP/IP协议栈中应用层协议的是( A )。(选择1项)
    • A:HTTP
    • B:TCP
    • C:UDP
    • D:IP

解析:

  • 应用层:FTP、 SMTP、HTTP
  • 传输层:TCP、UDP
  • IP网络层:IP、ICMP、IGMP
  • 网络接口层:ARP、RARP、FDDI
  1. 以下说法中关于UDP协议的说法正确的是( AD )。(选择2项)
    • A:发送不管对方是否准备好,接收方收到也不确认
    • B:面向连接
    • C:占用系统资源多、效率低
    • D:非常简单的协议,可以广播发送

解析:


image.png
  1. 在基于TCP网络通信模式中,客户与服务器程序的主要任务是( BC )。(选择2项)
    • A:客户程序在网络上找到一条到达服务器的路由
    • B:客户程序发送请求,并接收服务器的响应
    • C:服务器程序接收并处理客户请求,然后向客户发送响应结果
    • D:客户程序和服务器都会保证发送的数据不会在传输途中丢失

解析:
客户程序负责发送请求并接收服务器的响应,服务器程序负责接收处理客户请求并向客户发送响应结果。

  1. 在Java网络编程中,使用客户端套接字Socket创建对象时,需要指定( A )。(选择1项)
    • A:服务器主机名称和端口
    • B:服务器端口和文件
    • C:服务器名称和文件
    • D:服务器地址和文件

解析:
public Socket(String host, int port) throws UnknownHostException, IOException:创建一个流套接字并将其连接到指定主机上的指定端口号。

  1. ServerSocket的监听方法accept( )方法的返回值类型是( A )。(选择1项)
    • A:工厂模式
    • B:装饰模式
    • C:适配器模式
    • D:代理模式

解析:
public Socket accept() throws IOException:侦听并接受到此套接字的连接。

二、简答题

  1. 简述程序、进程和线程的联系和区别。


    image.png
  2. 创建线程的方式有哪些?各有什么优缺点。

    1. 继承Thread类,覆写run()方法
    2. 实现Runnable接口,覆写run()方法,没有返回值,无法上抛异常
    3. 实现Callable接口,覆写call()方法,有返回值,可以上抛异常
    4. 使用Executor框架创建线程池

    一般情况下,常见的是第二种和第三种,原因如下:

    1. 避免单继承带来的局限性
    2. 适合于资源共享
  3. 线程同步的三种方式。

    1. 使用同步代码块:synchronized (对象) {}
    2. 使用同步方法:public synchronized void function() {}
    3. 使用对象锁:Lock lock = new ReentrantLock();lock.lock();lock.unlock();
  4. 说明sleep、yield、join方法的区别。

    1. Thread.sleep():在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。sleep()方法使当前线程进入阻塞状态,所以执行sleep()方法的线程在指定的时间内肯定不会被执行。
    2. Thread.yield():让当前运行线程回到就绪状态,以允许其他线程获得运行机会。yield()方法只是让当前线程重新回到就绪状态,所以执行yield()方法的线程有可能在进入到就绪状态后马上又被执行。
    3. Thread对象的join():当前线程等待加入的线程终止后继续运行。在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()方法了。
  5. 说明线程池的原理和线程池的拒绝策略。
    线程池其实就是一组线程实时处于休眠状态,等待唤醒执行。
    使用线程池的目的:

    1. 减少在创建和销毁线程上所花费的时间及系统资源开销。
    2. 将当前任务与主线程隔离,实现和主线程的异步执行,特别是那些可以分开重复执行的任务。

    但是,一味的开线程不一定能带来性能上的优化,线池休眠也需要占用一定的内存空间,所以需要合理的选择线程池的大小。
    在线程池中执行任务比为每个任务单独分配一个线程要好得多,通过重用现有的线程而不是创建新线程,可以在处理多个请求时分摊线程创建和销毁所产生的巨大开销。当请求到达时,通常工作线程已经存在,提高了响应性。通过配置线程池的大小,可以创建足够多的线程使CPU达到忙碌状态,还可以防止线程太多而耗尽计算机的资源。
    创建ExecutorService线程池:ExecutorService executorService = Executors.newCachedThreadPool();
    ThreadPoolExecutor中包含了一个任务缓存队列和若干个执行线程,任务缓存队列是一个大小固定的缓冲区队列,用来缓存待执行的任务,执行线程用来处理待执行的任务。每个待执行的任务都必须实现Runnable接口,执行线程通过调用其run()方法来完成相应任务。
    ThreadPoolExecutor对象初始化时,不会创建任何执行线程,只有当有新任务进来时,才会创建执行线程。
    创建ThreadPoolExecutor对象时,需要配置该对象的核心线程池大小和最大线程池大小。
    当目前执行线程的总数小于核心线程池大小时,所有新加入的任务,都在新线程中处理。
    当目前执行线程的总数大于或等于核心线程池大小时,若任务缓存队列未满,则所有新加入的任务都放入任务缓存队列中,若任务缓存队列已满,同时目前执行线程的总数小于最大线程池大小,那么就会创建新线程加入线程池中,协助处理新加入的任务。
    当目前执行线程的总数等于最大线程池大小,并且缓存队列已满时,拒绝策略RejectedExecutionHandler就会拒绝新的任务。

  6. 简述TCP和UDP协议的异同。


    image.png

三、编码题

  1. 设计一个火车售票模拟程序。假如火车站要有100张火车票要卖出,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况。
  • 代码:
package sxt;

import java.io.IOException;

public class Test {
    public static void main(String args[]) throws IOException {
        TicketThread ticketThread = new TicketThread();

        for (int i = 1; i <= 5; i++) {
            new Thread(ticketThread, "售票点" + i).start();
        }
    }
}

class TicketThread implements Runnable {
    private Integer ticket = 1;

    @Override
    public void run() {
        while (ticket <= 100) {
            synchronized (ticket) {
                if (ticket <= 100) {
                    System.out.println(Thread.currentThread().getName() + "卖出了第" + ticket++ + "张票");
                }
            }
        }

        System.out.println("已售罄");
    }
}
  • 结果截图:


    image.png
    image.png
    image.png
    image.png
    image.png
  1. 编写两个线程,一个线程打印152的整数,另一个线程打印字母AZ,打印顺序为12A34B56C……5152Z,即按照整数和字母的顺序从小到大打印,并且每打印两个整数后,打印一个字母,交替循环打印,直到打印完整数52和字母Z后结束。
  • 代码:
package sxt;

public class Test {
    public static void main(String args[]) {
        Object lock = new Object();
        new Thread(new DigitThread(lock)).start();
        new Thread(new LetterThread(lock)).start();
    }
}

class DigitThread implements Runnable {
    private Object lock;
    private int digit = 1;

    public DigitThread(Object lock) {
        this.lock = lock;
    }

    @Override
    public void run() {
        synchronized (lock) {
            while (digit <= 52) {
                System.out.print(digit++);
                System.out.print(digit++);
                lock.notifyAll();

                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

class LetterThread implements Runnable {
    private Object lock;
    private char letter = 'A';

    public LetterThread(Object lock) {
        this.lock = lock;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        synchronized (lock) {
            while (letter <= 'Z') {
                System.out.print(letter++);
                lock.notifyAll();

                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
  • 结果截图:


    image.png
  1. 使用基于TCP的Java Socket编程,实现上传本地文件到服务器端。
  • 代码:
    服务器端
package sxt;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String args[]) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream inputStream = null;
        DataInputStream dataInputStream = null;
        BufferedInputStream bufferedInputStream = null;
        FileOutputStream fileOutputStream = null;
        BufferedOutputStream bufferedOutputStream = null;

        try {
            serverSocket = new ServerSocket(8888);
            socket = serverSocket.accept();
            inputStream = socket.getInputStream();
            dataInputStream = new DataInputStream(inputStream);
            bufferedInputStream = new BufferedInputStream(inputStream);
            fileOutputStream = new FileOutputStream(new File("D:\\Server" + File.separator + dataInputStream.readUTF()));
            bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
            byte[] bs = new byte[1024];
            int length = -1;

            while ((length = bufferedInputStream.read(bs)) != -1) {
                bufferedOutputStream.write(bs, 0, length);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedOutputStream != null) {
                try {
                    bufferedOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

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

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

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

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

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

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

客户端:

package sxt;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
    public static void main(String[] args) {
        Socket socket = null;
        FileInputStream fileInputStream = null;
        BufferedInputStream bufferedInputStream = null;
        OutputStream outputStream = null;
        DataOutputStream dataOutputStream = null;
        BufferedOutputStream bufferedOutputStream = null;

        try {
            socket = new Socket("127.0.0.1", 8888);
            File file = new File("D:\\Client\\Thinking_in_Patterns中文版.pdf");
            fileInputStream = new FileInputStream(file);
            bufferedInputStream = new BufferedInputStream(fileInputStream);
            outputStream = socket.getOutputStream();
            dataOutputStream = new DataOutputStream(outputStream);
            bufferedOutputStream = new BufferedOutputStream(outputStream);
            dataOutputStream.writeUTF(file.getName());
            byte[] bs = new byte[1024];
            int length = -1;

            while ((length = bufferedInputStream.read(bs)) != -1) {
                bufferedOutputStream.write(bs, 0, length);
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedOutputStream != null) {
                try {
                    bufferedOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

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

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

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

            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
  • 结果截图:


    image.png
    image.png

四、程序题

  • 项目结构+README:


    image.png
    image.png
  • 代码:
package entity;

import java.io.Serializable;

public class User implements Serializable {
    private static final long serialVersionUID = -2270550255047294276L;
    private String username;
    private String password;

    public User() {}

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User [username=" + username + ", password=" + password + "]";
    }
}
package service.impl;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import service.MusicService;

public class MusicServiceImpl implements MusicService {
    private MusicServiceImpl() {}

    private static volatile MusicServiceImpl musicServiceImpl = null;

    public static MusicServiceImpl getInstance() {
        if (musicServiceImpl == null) {
            synchronized (MusicServiceImpl.class) {
                if (musicServiceImpl == null) {
                    musicServiceImpl = new MusicServiceImpl();
                }
            }
        }

        return musicServiceImpl;
    }

    @Override
    public List<File> findAll() {
        return getMusicFileList("D:\\MyJava\\Workspace\\STS\\League-of-Legends\\src\\main\\resources\\static");
    }

    public List<File> getMusicFileList(String filePath) {
        List<File> musicFileList = new ArrayList<File>();

        for (File musicFile : new File(filePath).listFiles(new FileFilter() {
            @Override
            public boolean accept(File file) {
                if (file.isDirectory()) {
                    musicFileList.addAll(getMusicFileList(file.getPath()));
                } else {
                    return file.getName().toLowerCase().endsWith(".mp3");
                }

                return false;
            }
        })) {
            musicFileList.add(musicFile);
        }

        return musicFileList;
    }

    @Override
    public void upload(File file, String path) {
        Thread thread = new Thread(new IOThread(file, path));
        thread.start();
    }
}

class IOThread implements Runnable {
    private File file;
    private String path;

    public IOThread(File file, String path) {
        this.file = file;
        this.path = path;
    }

    @Override
    public void run() {
        FileInputStream fileInputStream = null;
        BufferedInputStream bufferedInputStream = null;
        FileOutputStream fileOutputStream = null;
        BufferedOutputStream bufferedOutputStream = null;

        try {
            fileInputStream = new FileInputStream(file);
            bufferedInputStream = new BufferedInputStream(fileInputStream);
            fileOutputStream = new FileOutputStream(new File(path + File.separator + file.getName()));
            bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
            byte[] bs = new byte[1024];
            int length = -1;

            while ((length = bufferedInputStream.read(bs)) != -1) {
                bufferedOutputStream.write(bs, 0, length);
            }

            System.out.println("\n" + path + File.separator + file.getName() + "上传成功!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedOutputStream != null) {
                try {
                    bufferedOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

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

            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
package service.impl;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import entity.User;
import service.UserService;

public class UserServiceImpl implements UserService {
    private UserServiceImpl() {}

    private static volatile UserServiceImpl userServiceImpl = null;

    public static UserServiceImpl getInstance() {
        if (userServiceImpl == null) {
            synchronized (UserServiceImpl.class) {
                if (userServiceImpl == null) {
                    userServiceImpl = new UserServiceImpl();
                }
            }
        }

        return userServiceImpl;
    }

    @Override
    public boolean login(User user) {
        Socket socket = null;
        InputStream inputStream = null;
        DataInputStream dataInputStream = null;
        OutputStream outputStream = null;
        ObjectOutputStream objectOutputStream = null;

        try {
            socket = new Socket("127.0.0.1", 8888);
            inputStream = socket.getInputStream();
            dataInputStream = new DataInputStream(inputStream);
            outputStream = socket.getOutputStream();
            objectOutputStream = new ObjectOutputStream(outputStream);
            objectOutputStream.writeObject(user);

            if (dataInputStream.readBoolean()) {
                return true;
            } else {
                return false;
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (objectOutputStream != null) {
                try {
                    objectOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

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

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

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

        return false;
    }
}
package service;

import java.io.File;
import java.util.List;

public interface MusicService {
    public abstract List<File> findAll();

    public abstract void upload(File file, String path);
}
package service;

import entity.User;

public interface UserService {
    public abstract boolean login(User user);
}
package socket;

import java.io.File;
import java.util.List;
import java.util.Scanner;

import entity.User;
import service.MusicService;
import service.UserService;
import service.impl.MusicServiceImpl;
import service.impl.UserServiceImpl;

public class Client {
    private static boolean isLogin;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        UserService userService = UserServiceImpl.getInstance();
        MusicService musicService = MusicServiceImpl.getInstance();

        while (true) {
            System.out.println("----------欢迎来到音乐上传网站----------");
            System.out.println("1. 登录");
            System.out.println("2. 上传音乐");
            System.out.println("3. 退出");
            System.out.println("----------------------------------------");
            System.out.print("请选择菜单:");
            int flag = scanner.nextInt();

            switch (flag) {
                case 1:
                    System.out.println("请输入用户名");
                    String username = scanner.next();
                    System.out.println("请输入密码");
                    String password = scanner.next();
                    isLogin = userService.login(new User(username, password));

                    if (isLogin) {
                        System.out.println("登陆成功!");
                    } else {
                        System.out.println("用户名或密码错误!");
                    }

                    break;
                case 2:
                    if (isLogin) {
                        System.out.println("这是您的歌单请查收");
                        System.out.println("编号\t名称");
                        List<File> musicFileList = musicService.findAll();

                        for (int i = 0; i < musicFileList.size(); i++) {
                            System.out.println((i + 1) + "\t" + musicFileList.get(i).getName());
                        }

                        System.out.println("请输入要上传的歌曲");
                        String fileName = scanner.next();
                        File file = null;

                        for (File musicFile : musicFileList) {
                            if (fileName.equals(musicFile.getName())) {
                                file = musicFile;
                                break;
                            }
                        }

                        if (file != null) {
                            System.out.println("请输入服务器地址");
                            String path = scanner.next();
                            musicService.upload(file, path);
                        } else {
                            System.out.println("输入错误!");
                        }
                    } else {
                        System.out.println("您还没有登陆,请先登录后再上传音乐");
                    }

                    break;
                case 7:
                    scanner.close();
                    System.exit(0);
                default:
                    System.out.println("输入错误!");
                    break;
            }
        }
    }
}
package socket;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import entity.User;

public class Server {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;

        try {
            serverSocket = new ServerSocket(8888);
            System.out.println("服务器准备就绪,等待客户端连接");

            while (true) {
                socket = serverSocket.accept();
                Thread thread = new Thread(new SocketThread(socket));
                thread.start();
                thread.join();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

class SocketThread implements Runnable {
    private Socket socket;

    public SocketThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "正在处理" + socket.getInetAddress() + "的登录验证");
        InputStream inputStream = null;
        ObjectInputStream objectInputStream = null;
        OutputStream outputStream = null;
        DataOutputStream dataOutputStream = null;

        try {
            inputStream = socket.getInputStream();
            objectInputStream = new ObjectInputStream(inputStream);
            outputStream = socket.getOutputStream();
            dataOutputStream = new DataOutputStream(outputStream);
            User user = (User) objectInputStream.readObject();

            if ("lbc".equals(user.getUsername()) && "123".equals(user.getPassword())) {
                dataOutputStream.writeBoolean(true);
            } else {
                dataOutputStream.writeBoolean(false);
            }

            System.out.println("验证完成");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (dataOutputStream != null) {
                try {
                    dataOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

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

            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
  • 结果截图:


    image.png
    image.png
    image.png
    image.png
    image.png

相关文章

网友评论

      本文标题:实操七

      本文链接:https://www.haomeiwen.com/subject/wyauhqtx.html