2021-05-22

一道题了解IO流和网络编程问题

1、服务器端

package com.atclass.lasttest05;

import java.net.ServerSocket;
import java.net.Socket;

public class TestServer {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(1313);
            while (true) {
                Socket socket = serverSocket.accept();//相当于监控器(监控接收)
                ServerThread serverThread=new ServerThread(socket);
                serverThread.start();//线程开启
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

       package com.atclass.lasttest05;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.List;

public class ServerThread extends Thread {
    /**
     * 当一个类中想要引用另一个(another)类时候,建议把another做成该类的属性,
     * 之后便于使用;
     */
    private Socket socket;

    ServerThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            //①接收从客户端输入;
            ObjectInputStream ois =
                    new ObjectInputStream(socket.getInputStream());
            MyData myData = (MyData) ois.readObject();
            //没有确认命令的时候不能确定是否泛型指的是User类型;所以直接创建
            // 一个没有泛型的去接收客户端信息;
            socket.shutdownInput();

            //输入结束;
            //②创建输入的条件判断;并为提供给需要返回给客户端信息;
            MyData returnData = new MyData();
            if (myData.getOrder().equals("login")) {
                MyData<User> myData1 = (MyData<User>) myData; //确认泛型指的是user
                // 时候可以直接创建MyData类型去接收之前接收到的并存入程序中的信息
                // (需要将之前的信息强转成泛型为User的MyData类型)

                User user = myData1.getData();//调用myData1的data属性;
                //从硬盘文件中获取信息,并与客户端输入信息进行比较;
                // 并将信息返回给returnData;
                TestServerInputContent testServer1 =
                        new TestServerInputContent();
                List<User> list = testServer1.getAllClients();
                boolean flag = false;
                //遍历list来查询匹配;
                for (User user1 : list) {
                    if (user1.getName().equals(user.getName())
                            && user1.getPassword().equals(user.getPassword())) {
                        flag=true;
                        break;
                    }
                }
                //返回信息给returnData;
                if (flag) {
                    returnData.setInfo("登录成功!");
                    returnData.setFlag(true);
                } else {
                    returnData.setInfo("密码或者用户名输入有误,请重新输入");
                    returnData.setFlag(false);
                }

                //③为客户端输出信息;
                ObjectOutputStream oos =
                        new ObjectOutputStream(socket.getOutputStream());
                oos.writeObject(returnData);
                oos.flush();
                oos.close();
                socket.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2、客户端

package com.atclass.lasttest05;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;

public class TestClient {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        boolean flag;
        try {
            do {
                flag=false;
                //①创建与服务器的连接;给出IP地址和端口;
                Socket socket = new Socket("localhost", 1313);
                //②对服务器进行信息传输;
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                MyData<User> myData=new MyData<>();
                User user=new User();
                System.out.println("请输入用户名:");
                user.setName(input.next());
                System.out.println("请输入密码:");
                user.setPassword(input.next());
                myData.setOrder("login");
                myData.setData(user);
                oos.writeObject(myData);
                oos.flush();//清除程序空间;(输出后需要使用)
                socket.shutdownOutput();
                //③信息传输结束;

                //④从服务器接收信息开始;

                ObjectInputStream ois=
                        new ObjectInputStream(socket.getInputStream());
                //存储从服务器接收的信息;
                MyData<User> myData1=(MyData<User>) ois.readObject();
                //循环判断
                if (!myData1.isFlag()){
                    flag=true;
                }
                //输出服务器送来的判断信息;
                System.out.println(myData1.getInfo());
                ois.close();
                socket.close();
            } while (flag);
            System.out.println("程序结束!");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

3、各个类

package com.atclass.lasttest05;

import java.io.Serializable;

public class User implements Serializable {
    private String name;
    private String password;

    public User() {
    }

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

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
package com.atclass.lasttest05;

import java.io.Serializable;

public class MyData<T> implements Serializable {
    //该处的泛型T是为了方便以后对代码的扩展;遵循开闭原则(对修改关闭,对扩展开放)
    //Serializable接口是为了实现序列化;
    private String order;
    private T data;
    private boolean flag;
    private String info;

    public MyData() {
    }

    public String getOrder() {
        return order;
    }

    public void setOrder(String order) {
        this.order = order;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值