Java基础——网络编程

网络编程

一、计算机网络

二、计算机网络发展

  • 四个阶段

    • 诞生阶段:一台主机,多个终端
    • 形成阶段:美国国防部高级研究计划局协助开发的ARPANET
    • 互联互通阶段:标准化的网络,OSI参考模型和TCP/IP参考模型
    • 告诉发展阶段:光纤及高速网络技术,发展为以因特网为代表的互联网
  • 分类:按照地理范围

    • 局域网
    • 城域网
    • 广域网

三、OIS参考模型

OSI (Open System Interconnection) 开放式系统互联

在这里插入图片描述

  • 第七层:应用层负责文件访问和管理、可靠运输服务,远程操作服务。(HTTP,FTP,SMTP)
  • 第六层:表示层负责定义转换数据格式及加密,允许选择以二进制或ASCII格式传输。
  • 第五层:会话层负责使应用建立和维持会话,使通信在失效时继续恢复通信。(断点续传)
  • 第四层:传输层负责是否选择差错恢复协议,数据流重用,错误顺序重排。(TCP,UDP)
  • 第三层:网络层负责定义了能够标识所有网络结点的逻辑地址。(IP地址)
  • 第二层:链路层在物理层上,通过规程或协议(差错控制)来控制传输数据的正确性。(MAC)
  • 第一层:物理层为设备之间的数据通信提供传输信号和物理介质。(双绞线,光导纤维)

四、TCP/IP模型

一组用于实现网络互联的通信协议,将协议分成四个层次

在这里插入图片描述

  • 第四层:应用负责传送各种最终形态的数据,是直接与用户打交道的层,典型协议是HTTP,FTP等
  • 第三层:传输层负责传送文本数据,主要协议是TCP,UDP协议
  • 第二层:网络层负责分配地址和传送二进制数据,主要协议是IP协议
  • 第一层:接口层负责建立电路连接,是整个网络的物理基础,典型的协议包括以太网,ADSL等等

五、IP

IP协议:Internet Protocol Address 互联网协议地址/网际协议地址。分配给互联网设备的数字标签(唯一标识)

5.1 IP地址

  • IPV4:4字节32位整数,并分成4段8位的二进制,每8位之间用圆点隔开,每8位整数可以转换为一个0~255的十进制整数。
    • 格式:D.D.D.D 例如:255.255.255.255
  • IPV6:16字节128位整数,并分成8段十六进制数,每16位之间用圆点隔开,每16位整数可以转换为一个0~65535的十进制数。
    • 格式:X.X.X.X.X.X.X.X 例如:FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF

5.2 IPV4应用分类

  • A类:政府机构,1.0.01~126.255.255.254
  • B类:中型企业,128.0.0.1~191.255.255.254
  • C类:个人用户,192.0.0.1~223.255.255.254
  • D类:用户组播,224.0.0.1~239.255.255.254
  • E类:用于实验,240.0.0.1~255.255.255.254
  • 回环地址:127.0.0.1,指本机,一般用于测试使用
  • 查看IP命令:ipconfig
  • 测试IP命令:ping D.D.D.D

5.3 Port端口号

端口号:在通信实体上进行网络通讯的程序的唯一标识。整数:0~65535

端口分类

  • 公认端口:0~1023
  • 注册端口:1024~49151
  • 动态或私有端口:49152~65535

常用端口:

  • MySql:3306
  • Oracle:1521
  • Tomcat:8080
  • SMTP:25
  • Web服务器:80,443
  • FTP服务器:21
  • netstat -ano 查看端口号

5.5 DNS

DNS(Domain Name System):“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络

作用

  • 用来将主机名和域名转换为IP地址的工作。

在这里插入图片描述

DNS解析过程

​ 输入www.taobao.com时,DNS解析又大致十个过程

  1. 浏览器先检查自身缓存中有没有被解析过这个域名对应的ip地址,如果有,解析结束。同时域名被缓存的时间也可通过TTL属性来设置。
  2. 如果浏览器缓存中没有(专业点叫还没命中),浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程
  3. 如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般在你的吃食的某个角落,大约80%的域名解析到这里就完成了
  4. 如果LDNS仍然没有命中,就直接跳到Root Server域名服务器请求解析
  5. 根据域名服务器返回给LDNS一个所查询域的主域名服务器地址(国际顶尖域名服务器,如.com .cn .org等)
  6. 此时LDNS再发送请求给上一步返回的gTLD
  7. 接受请求的gTLD查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器
  8. Name Server根据映射关系表找到目标ip,返回给LDNS
  9. LDNS缓存这个域名和对应的ip
  10. LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束

5.5 InetAddress类

概念:表示互联网协议(IP)地址对象,封装了与该IP地址相关的所有信息,并提供获取信息的常用方法。

方法

  • public static InetAddress getLocalHost()
    • 获取本地主机地址对象
  • public static InetAddress getByName(String host)
    • 根据主机名称获得地址对象
  • public static InetAddress[] getAllByName(String host)
    • 获得所有相关地址对象
  • public String getHostAddress()
    • 获取IP地址字符串
  • public String getHostName()
    • 获得IP地址主机名

五、TCP/UDP

  • TCP协议:Transmission Control Protocol 传输控制协议
    • 是一种面向连接的,可靠的,基于字节流的传输层通信协议。数据大小无限制。建立连接的过程需要三次握手,断开连接的过程需要四次挥手
    • 标志位
      • SYN 发起一个新连接
      • ACK 确认序号有效
      • FIN 释放一个连接
  • UDP协议:User Datagram Protocol 用户数据报协议
    • 是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,每个包的大小是64K

三次握手

在这里插入图片描述

四次挥手

在这里插入图片描述

5.1 TCP

基于TCP网络编程

Socket

  • Socket(套接字)是网络中的一个通信结点
  • 分为客户端Socket和服务器ServerSocket
  • 通信要求:IP地址+端口号

开发步骤

  • 服务器端
    • 创建服务器套接字,并指定端口号
    • 侦听,并返回客户端套接字
    • 获取输入流,输出流
    • 处理数据
    • 关闭资源
  • 客户端
    • 创建客户端套接字,并指定服务器的地址和端口号
    • 获取输入流,输出流
    • 处理数据
    • 关闭资源
5.1.1 案例一:TCP编程实现客户端发送数据给服务端,服务端发送给客户端
//TCP编程实现客户端发送数据给服务端,服务端发送给客户端
//服务器
public class TcpServer {
    public static void main(String[] args)throws  Exception {
        //(1)创建服务器套接字,并指定端口号
        ServerSocket listener=new ServerSocket(8899);
        //(2)侦听客户端连接,并返回客户端套接字
        System.out.println("服务器已启动");
        Socket socket = listener.accept();
        //(3)获取输入输出流
        BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"));
        //(4)处理数据
        String data = br.readLine();//遇到换行符才返回
        System.out.println("客户端说:"+data);
        bw.write("老地方见!");
        bw.newLine();
        bw.flush();
        //(5)关闭资源
        br.close();
        bw.close();
        socket.close();
        listener.close();
    }
}
//客户端
public class TcpClient {
    public static void main(String[] args) throws Exception{
        //(1)创建客户端套接字,并指定服务器的地址和端口号
        Socket socket=new Socket("10.9.62.184", 8899);
        //(2)获取输入输出流
        BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"));
        //(3)处理数据
        bw.write("好久不见");
        bw.newLine();//坑
        bw.flush();
        String reply = br.readLine();
        System.out.println("服务器回复:"+reply);
        //(4)关闭资源
        br.close();
        bw.close();
        socket.close();
    }
}
5.1.2 案例二:TCP编程实现客户端上传文件给服务器端
//TCP编程实现客户端上传文件给服务器端
//服务器
public class FileServer {
    public static void main(String[] args) throws  Exception{
        //(1)创建服务器套接字,并指定端口号
        ServerSocket listener=new ServerSocket(6666);
        //(2)侦听,并返回客户端套接字
        System.out.println("服务器已启动...");
        Socket socket = listener.accept();
        //(3)获取输入流
        InputStream is = socket.getInputStream();
        BufferedInputStream bis=new BufferedInputStream(is);
        //(4)处理
        FileOutputStream fos=new FileOutputStream("d:\\111.jpg");
        int data;
        while((data=bis.read())!=-1){
            fos.write(data);
        }
        //(5)关闭
        fos.close();
        bis.close();
        socket.close();
        listener.close();
        System.out.println("接收完毕");

    }
}
//客户端
public class FileClient {
    public static void main(String[] args) throws  Exception{
        //(1)创建客户端套接字,并指定服务器的地址和端口号
        Socket socket=new Socket("10.9.62.184", 6666);
        //(2)获取输出
        OutputStream os = socket.getOutputStream();
        BufferedOutputStream bos=new BufferedOutputStream(os);
        //(3)处理数据
        FileInputStream fis=new FileInputStream("d:\\图片\\copy.jpg");
        byte[] buf=new byte[1024];
        int len;
        while((len=fis.read(buf))!=-1){
            bos.write(buf,0,len);
            bos.flush();
        }
        //(4)关闭
        bos.close();
        fis.close();
        socket.close();
        System.out.println("发送完毕");
    }
}
5.1.3 案例三:TCP实现客户端通信
//TCP实现客户端通信
//服务器
public class ChatServer {
    public static ConcurrentHashMap<String,Socket> hashMap=new ConcurrentHashMap<>();
    public static void main(String[] args){
        //主线程负责侦听
        //1 创建ServerSocket,并指定端口号
        ServerSocket listener=null;
        ExecutorService es= Executors.newCachedThreadPool();

        try {
            listener=new ServerSocket(8888);
            //2 侦听
            System.out.println("聊天室已启动...");
            while(true) {
                Socket socket = listener.accept();
                //放入HashMap中
                hashMap.put(socket.getInetAddress().getHostAddress(), socket);
                System.out.println(socket.getInetAddress().getHostAddress()+"进入聊天室了...");
                es.submit(new DataSocket(socket));
            }

        } catch (IOException e) {
            System.out.println("服务器已关闭...");
        } finally {
            //3关闭
            try {
                listener.close();
                es.shutdown();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
//客户端
public class ChatClient {
    static boolean flag=true;
    public static void main(String[] args) throws Exception{
        //(1)创建客户端套接字
        Socket socket=new Socket("10.9.62.184", 8888);

        new Thread(new Runnable() {
            @Override
            public void run() {
                //处理数据
                Scanner input=new Scanner(System.in);
                while(true){
                    String data = input.next();
                    try {
                        //获取输出流
                        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"));
                        bw.write(data);
                        bw.newLine();
                        bw.flush();
                        if(data.equals("byebye")||data.equals("886")){
                            break;
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                flag=false;
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){
                    try {
                        if(!flag){
                            break;
                        }
                        BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));
                        String s = br.readLine();
                        System.out.println(s);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        //(4)关闭
//        bw.close();
//        socket.close();
//        System.out.println("已关闭");
    }
}
//任务
public class DataSocket implements Runnable {

    private Socket socket;

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

    @Override
    public void run() {
        //接收数据
        BufferedReader br = null;
        try {
            InputStream is = socket.getInputStream();
            br = new BufferedReader(new InputStreamReader(is, "utf-8"));
            String line;
            while ((line = br.readLine()) != null) { //(1)如果为null ,说明客户端正常关闭了, (2) 如果客户非正常关闭,抛出异常
                转发///
                int pos = line.indexOf(":");
                if (pos >= 0) {
                    String ip = line.substring(0, pos);
                    if (ChatServer.hashMap.containsKey(ip)) {
                        Socket toSocket = ChatServer.hashMap.get(ip);
                        OutputStream os = toSocket.getOutputStream();
                        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, "utf-8"));
                        String d = line.substring(pos + 1);
                        bw.write(socket.getInetAddress().getHostAddress() + ":" + d);
                        System.out.println("转发:" + socket.getInetAddress().getHostAddress() + ":" + d);
                        bw.newLine();
                        bw.flush();
                    }
                }
                ///
                System.out.println(socket.getInetAddress().getHostAddress() + "说:" + line);
                if (line.equals("byebye") || line.equals("886")) {
                    break;
                }
            }
            System.out.println(socket.getInetAddress().getHostAddress() + "退出了聊天");
        } catch (Exception e) {
            System.out.println(socket.getInetAddress().getHostAddress() + "异常退出了聊天");
            System.out.println(e.getMessage());
        } finally {
            try {
                br.close();
                socket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
5.1.4 案例四:注册登陆
//登陆,服务端
public class Login implements Runnable {
    @Override
    public void run() {
        try {
            //(1)创建ServerSocket,指定端口号
            ServerSocket listener=new ServerSocket(7777);
            //(2)侦听,返回套接字
            System.out.println("登录服务器已启动...");
            Socket socket = listener.accept();
            //(3)获取输入输出流
            ObjectInputStream ois=new ObjectInputStream(socket.getInputStream());
            BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            //(4)处理数据
            User user = (User) ois.readObject();
            //4.1 读取硬盘中的集合对象
            List<User> users=Tools.readUsers();
            //4.2判断是否存在
            boolean flag=false;
            for (int i = 0; i < users.size(); i++) {
                User u = users.get(i);
                if(user.getId().equals(u.getId())&&user.getPwd().equals(u.getPwd())){
                    flag=true;
                    break;
                }
            }
            //4.3回复数据
            if(flag){
                //登录成功
                bw.write("登录成功");
            }else{
                //登录失败
                bw.write("用户名或密码错误");
            }
            bw.newLine();
            bw.flush();
            //(5)关闭资源
            bw.close();
            ois.close();
            socket.close();
            listener.close();

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

//服务端:注册
public class Regist implements Runnable {
    @Override
    public void run() {
        try {
            //(1)创建ServerSocket,指定端口号
            ServerSocket listener=new ServerSocket(6666);
            //(2)侦听,返回套接字
            System.out.println("注册服务器已启动...");
            Socket socket = listener.accept();
            //(3)获取输入输出流
            ObjectInputStream ois=new ObjectInputStream(socket.getInputStream());
            BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            //(4)处理数据
            User user = (User) ois.readObject();
            //4.1 读取硬盘中的集合对象
            List<User> users=Tools.readUsers();
            //4.2判断是否存在
            boolean flag=false;
            for (int i = 0; i < users.size(); i++) {
                User u = users.get(i);
                if(user.getId().equals(u.getId())){
                    flag=true;
                    break;
                }
            }
            //4.3回复数据
            if(flag){
                //注册失败
                bw.write("注册失败,用户id已存在");
            }else{
                //注册成功
                bw.write("注册成功");
                //把注册信息写入硬盘
                users.add(user);
                Tools.writeUsers(users);
            }
            bw.newLine();
            bw.flush();
            //(5)关闭资源
            bw.close();
            ois.close();
            socket.close();
            listener.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
//工具类:注册数据存储硬盘或从硬盘读取
public class Tools {

    public static List<User> readUsers(){
        List<User> users=null;
        try {
            File file=new File("d:\\users.bin");
            if(file.exists()){
                ObjectInputStream ois2=new ObjectInputStream(new FileInputStream(file));
                users=(List<User>) ois2.readObject();
                ois2.close();
            }else{
                users=new ArrayList<>();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return users;
    }

    public static void writeUsers(List<User> users){
        try {
            File file=new File("d:\\users.bin");
            ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));
            oos.writeObject(users);
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
//用户类
public class User implements Serializable {
    private static final long serialVersionUID=1000L;
    private String id;
    private String name;
    private String pwd;
    private int age;
    private double score;

    public User(String id, String name, String pwd, int age, double score) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
        this.age = age;
        this.score = score;
    }

    public User() {
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}
//启动线程服务
public class UserServer {
    public static void main(String[] args) {
        new Thread(new Regist()).start();
        new Thread(new Login()).start();
    }
}

5.2 UDP

  • DatagramSocket:表示用来发送和接收数据报包的套接字
  • DatagramPacket:表示数据报包
//UDP实现注册,登陆
//注册
public class Regist implements Runnable {
    @Override
    public void run() {

        ServerSocket listener = null;
        Socket socket = null;
        ObjectInputStream ois = null;
        BufferedWriter bw = null;
        ObjectInputStream ois2 = null;
        try {
            //创建服务器套接字对象,并确定端口
            listener = new ServerSocket(6666);

            System.out.println("注册服务器已启动。。。");
            //侦听,返回套接字
            socket = listener.accept();
            //获取输入输出流
            ois = new ObjectInputStream(socket.getInputStream());

            bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
            //处理数据
            User user = (User) ois.readObject();
            //读取硬盘中的集合对象
            File file = new File("d:\\user.bin");
            List<User> users;
            if (file.exists()) {
                //集合文件存在,读取到对象集合中
                ois2 = new ObjectInputStream(new FileInputStream(file));
                users = (List<User>) ois2.readObject();
            } else {
                //文件不存在,新建一个集合,返回一个空集合
                users = new ArrayList<>();
            }

            boolean flag = false;
            //判断是否存在
            for (int i = 0; i < users.size(); i++) {
                User u = users.get(i);

                if (user.getId().equals(u.getId())) {
                    flag = true;
                    break;
                }
            }
            //回复数据
            if (flag) {
                //注册失败
                bw.write("注册失败,用户ID已存在");
            } else {
                //注册成功
                bw.write("注册成功");
                //把注册信息写入硬盘
//                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file,true));
                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
                users.add(user);
                oos.writeObject(users);
                oos.close();
            }
            bw.newLine();
            bw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (listener != null) {
                try {
                    listener.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (ois != null) {
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (ois2 != null) {
                try {
                    ois2.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bw != null) {
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

//登陆
public class Login implements Runnable{
    @Override
    public void run() {

        ServerSocket listener = null;
        Socket socket = null;
        ObjectInputStream ois = null;
        BufferedWriter bw = null;
        ObjectInputStream ois2 = null;
        try {
            //创建服务器套接字对象,并确定端口
            listener = new ServerSocket(7777);

            System.out.println("登陆服务器已启动。。。");
            //侦听,返回套接字
            socket = listener.accept();
            //获取输入输出流
            ois = new ObjectInputStream(socket.getInputStream());

            bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
            //处理数据
            User user = (User) ois.readObject();
            //读取硬盘中的集合对象
            File file = new File("d:\\user.bin");
            List<User> users;
            if (file.exists()) {
                //集合文件存在,读取到对象集合中
                ois2 = new ObjectInputStream(new FileInputStream(file));
                users = (List<User>) ois2.readObject();
                ois2.close();
            } else {
                //文件不存在,新建一个集合,返回一个空集合
                users = new ArrayList<>();
            }

            boolean flag = false;
            //判断是否存在
            for (int i = 0; i < users.size(); i++) {
                User u = users.get(i);

                if (user.getId().equals(u.getId())&&user.getPwd().equals(u.getPwd())) {
                    flag = true;
                    break;
                }
            }
            //回复数据
            if (flag) {
                //登陆失败
                bw.write("登陆成功");
            } else {
                //登陆成功
                bw.write("登陆失败,用户id或密码错误");

            }
            bw.newLine();
            bw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (listener != null) {
                try {
                    listener.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

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

    }
}

//客户端
public class RegistClient {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        System.out.println("-------1.注册     2.登陆-------");
        int choice = scanner.nextInt();
        switch (choice){
            case 1:
                regist();
                break;

            case 2:
                login();
                break;
            default:
                System.out.println("输入有误");
                break;
        }

    }
    public static void regist(){
        //1.创建Socket指定服务器的地址和端口号
        Socket socket = null;
        ObjectOutputStream oos = null;
        BufferedReader br = null;
        try {
            socket = new Socket("10.9.62.210",6666);
            //2.获取输入输出流
            oos = new ObjectOutputStream(socket.getOutputStream());
            br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
            //3.处理数据
            //发送
            User user = getUser();
            //序列化
            oos.writeObject(user);
            oos.flush();

            //读取
            String reply = br.readLine();
            System.out.println("服务器回复:"+reply);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(oos!=null) {
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(br!=null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket!=null){

                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static User getUser(){
        Scanner input = new Scanner(System.in);
        System.out.println("请输入用户ID");
        String id = input.next();
        System.out.println("请输入姓名");
        String name = input.next();
        System.out.println("请输入密码");
        String pwd = input.next();

        System.out.println("请输入年龄");
        int age = input.nextInt();
        System.out.println("请输入成绩");
        double score = input.nextDouble();
        return new User(id, name, pwd, age, score);
    }

    public static void login(){
        //1.创建Socket指定服务器的地址和端口号
        Socket socket = null;
        ObjectOutputStream oos = null;
        BufferedReader br = null;
        try {
            socket = new Socket("10.9.62.210",7777);
            //2.获取输入输出流
            oos = new ObjectOutputStream(socket.getOutputStream());
            br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
            //3.处理数据
            Scanner input = new Scanner(System.in);
            System.out.println("请输入用户id");
            String id = input.next();
            System.out.println("请输入用户密码");
            String pwd = input.next();
            User user = new User(id, null, pwd, 0, 0);
            //发送
//            User user = getUser();
            //序列化
            oos.writeObject(user);
            oos.flush();

            //读取
            String reply = br.readLine();
            System.out.println("服务器回复:"+reply);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(oos!=null) {
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(br!=null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket!=null){

                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
//启动服务
public class UserServer {
    public static void main(String[] args) {
        new Thread(new Regist()).start();
        new Thread(new Login()).start();
    }
}
//用户类
public class User implements Serializable {

    private static final long serialVersionUID = 12222l;
    private String id;
    private String name;
    private String pwd;
    private int age;
    private double score;

    public User() {
    }

    public User(String id, String name, String pwd, int age, double score) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
        this.age = age;
        this.score = score;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值