会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132428个问题
JAVA 全系列/第二阶段:JAVA 基础深化和提高/IO 流技术(旧) 2971楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 2973楼

老师好,以下是我的代码和实现的效果:

package com.lichen.client;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Test {
    public static void main(String[] args) throws IOException {
        System.out.println("----------客户端已启动--------------");
        //1.创建Socket对象
        Socket client = new Socket("localhost", 9999);
        //2.创建输出流
        OutputStream os = client.getOutputStream();
        os.write("Do you copy?".getBytes());
        //3.获取输入流
        InputStream is = client.getInputStream();
        //中转站
        byte[] buf = new byte[1024];
        int len = 0;
        while((len = is.read(buf)) != -1) {
            System.out.println(new String(buf, 0, len));
        }
        //4.关闭流

        if (is != null) {
            is.close();
        }
        if (os != null) {
            os.close();
        }
        if (client != null) {
            client.close();
        }
        System.out.println("----------客户端已关闭--------------");
    }
}
package com.lichen.server;

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

public class Test {
    public static void main(String[] args) throws IOException {
        System.out.println("----------服务端已启动--------------");
        //1.创建ServerSocket对象
        ServerSocket sever = new ServerSocket(9999);
        //2.监听是否有客户端来请求链接
        Socket client = sever.accept();
        //3.获取输入流
        InputStream is = client.getInputStream();
        //中转站
        byte[] buf = new byte[1024];
        int len = 0;
        while((len = is.read(buf)) != -1) {
            System.out.println(new String(buf, 0, len));
            if(len < buf.length) {
                break;
            }
        }
        //4.创建输出流
        //"copy that."
        OutputStream os = client.getOutputStream();
        os.write("Copy that.".getBytes());
        //5.关闭流,关闭Socket
        if(os != null) {
            os.close();
        }
        if(is != null) {
            is.close();
        }
        if(client != null) {
            client.close();
        }
        System.out.println("----------服务端已关闭--------------");
    }
}

我的问题是:为什么服务端在读客户端发来的数据时,要加

            if(len < buf.length) {
                break;
            }

这段代码,而客户端在读服务端的时候就不需要呢?

JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 2977楼

1、Users源码

import java.util.Objects;

/***
 * 自定义类
 */
public class Users implements Comparable<Users>{
    private String userName;
    private int UserAge;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getUserAge() {
        return UserAge;
    }

    public void setUserAge(int userAge) {
        UserAge = userAge;
    }

    /***
     * 自定义类
     * @param userName  姓名
     * @param userAge   年龄
     */
    public Users(String userName, int userAge) {
        this.userName = userName;
        UserAge = userAge;
    }

    /***
     * 自定义类
     */
    public Users() {
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Users users = (Users) o;
        return UserAge == users.UserAge &&
                Objects.equals(userName, users.userName);
    }

//    @Override
//    public String toString() {
//        return "Users{" +
//                "userName='" + userName + '\'' +
//                ", UserAge=" + UserAge +
//                '}';
//    }

    @Override
    public int hashCode() {
        return Objects.hash(userName, UserAge);
    }

    //定义比较规则
    @Override
    public int compareTo(Users o) {
        //年龄排序
        if(this.UserAge > o.UserAge)
            return 1;
        //年龄相同姓名比较
        if(this.UserAge == o.UserAge)
            return this.userName.compareTo(o.getUserName());
        return 0;
    }
}

2、TreeMapTest源代码

import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapTest {
    public static void main(String[] args) {
        //实例化TreeMap
        Map<Users,String> tree = new TreeMap<>();

        //实例化Users
        Users u1 = new Users("张三",15);
        Users u2 = new Users("王五",23);
        Users u3 = new Users("陈述",63);

        tree.put(u1,"无法言语");
        tree.put(u2,"难过");
        tree.put(u3,"绝对");

        Set<Users> keys = tree.keySet();
        for(Users i : keys)
            System.out.println(i + "--------" + tree.get(i));
    }
}

3、结果运行图

 1)不注释toString

image.png

 2)注释toString

image.png

这是什么情况?为什么会出现这种情况?

而且单纯修改一下比较规则还会出现新问题

4、修改截图

image.png

5、运行截图

image.png

其他两个就没有了?

JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 2978楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程 2980楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/数据结构 2981楼

class Account{
    //账号
    private String accountNo;
    //账户余额
    private double balance;

    public String getAccountNo() {
        return accountNo;
    }

    public void setAccountNo(String accountNo) {
        this.accountNo = accountNo;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    public Account() {
    }

    public Account(String accountNo, double balance) {
        this.accountNo = accountNo;
        this.balance = balance;
    }
}

/**
 * 取钱线程
 */
class DrawThread implements Runnable{
    //账户对象
    private Account account;
    //取款金额
    private double drawMoney;

    public DrawThread(Account account, double drawMoney) {
        this.account = account;
        this.drawMoney = drawMoney;
    }

    public DrawThread() {
    }

    //取款线程体
    @Override
    public void run() {
        synchronized(this.account) {
            //判断当前账户余额是否大于或等于取款金额
            if (this.account.getBalance() >= this.drawMoney) {
                System.out.println(Thread.currentThread().getName() + "取钱成功,突出钞票" + this.drawMoney);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //更新账号
                this.account.setBalance(this.account.getBalance() - this.drawMoney);
                System.out.println("\t 余额为:" + this.account.getBalance());
            } else {
                System.out.println(Thread.currentThread().getName() + "取钱失败,余额不足");
            }
        }
    }
}
public class TestDrawMoneyThread {
    public static void main(String[] args) {
        Account account=new Account("1234",1000);
        new Thread(new DrawThread(account,800),"老公");
        new Thread(new DrawThread(account,800),"老婆");
    }
}

image.png

为什么我这个没有任何输出?

JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程技术 2982楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程和并发编程(旧) 2984楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 2985楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637