今天上课困死了(因为看了凌晨3点的欧冠半决赛)就睡了4小时,很多都没听进去,还好今天学的不难,晚上熬夜把代码敲了一遍-_ -理解的差不多了,但是听说明天讲的内容很难,早点睡!!明天要好好听课
时间: 2022/4/27
Junit
概述
Junit是第三方的测试工具。
第三方:
不是java中存在的技术,也不是我们自己写的代码,是别人写好的,我们能够拿来用的。
测试:
以前我们写代码之后要写main()方法,junit可以代替main方法
使用步骤:
1.下载junit.jar包
2.把jar包导入idea中,在模块下面创建叫lib的文件夹,把jar包放进去
3.在jar包上右键点击add as library
常用注解
*@Test
测试方法。这个方法不能有参数也不能有返回值也不能加static
@Before
在测试方法之前执行的方法,每次执行测试方法都会先执行Before
@After
在测试方法之后执行的方法,每次执行测试方法之后都会执行After
@BeforeClass
在测试类执行之前最先执行,方法必须是一个静态方法
@AfterClass
在测试类执行最后执行,方法必须是一个静态方法
这块没啥好讲的就加一个注解@Test就行了,相当于main函数
public class Demo01 {
@Test
public void addTest(){
//调用方法,测试方法
int c = add(10, 20);
System.out.println(c);
//断言
//如果两个数结果不同,程序就会报错提示
Assert.assertEquals(30,c);
}
@Before
public void aaa(){
System.out.println("aaa");
}
@After
public void bbb(){
System.out.println("bbb");
}
//求两个数的和
public int add(int a, int b){
int c = a - b;
return c;
}
}
网络编程入门
软件结构
B/S(browser浏览器 server服务器 )
比如:
淘宝网,京东网,博学谷
优缺点:
不需要安装下载,只要有浏览器就可以
C/S(client客户端 server服务器)
比如:
英雄联盟,微信
优缺点:
功能强大,对网络的依赖少
网络编程三要素
IP地址:
在网络中的计算机都有一个唯一的IP地址
如何查看:在命名行窗口 —> ipconfig
ipv4:
以32位二进制组成的一组数字,可以组成40多亿个不重复的ip,目前已经被用完了,由4个字节组成
ipv6:
以128位二进制组成的一组数字,可以为全世界的每一粒沙子分配一个不重复的ip 由16个字节组成
端口号:
端口号是软件的唯一标识,
端口号取值范围:
0 ~ 65535之间, 0~1023的范围建议留给系统软件使用
传输协议
传输协议的作用是指定要以什么样的方式传输数据
TCP协议:
面向连接的协议,传输的双方必须要确认建立的连接才能发数据
比较安全
效率低
建立连接的三次握手
UDP协议:
面向无连接的协议,传输的双方不需要建立连接就可以发送数据
比较不安全
效率高
每次发送有大小限制,每次最多只能发64K的数据
InetAddress类
作用:
这个类代表的是java中的ip地址,可以用这个类获取网络中电脑的ip
java里面任何东西都是对象,ip就是一个对象叫InetAddress
-
static InetAddress getLocalHost()
获得本地主机IP地址对象 -
static InetAddress getByName(String host)
根据IP地址字符串或主机名获得对应的IP地址对象 -
String getHostName()
获得主机名 -
String getHostAddress()
获得IP地址字符串
TCP通信程序
TCP操作概述
TCP有两个类:
Socket 套接字,表示TCP里客户端类型
ServerSocket 表示TCP里服务器类型
TCP通信案例1
public class Demo01客户端 {
public static void main(String[] args) throws IOException {
//创建客户端对象 指定要连接的服务器
Socket s = new Socket("192.168.23.9",8888);
//要给服务端发送一句话
String str = "你好呀";
//获取输出流
OutputStream os = s.getOutputStream();
//输出数据 把字符串转成字节数组使用字节输出流输出
os.write(str.getBytes());
//关资源
//os不是我们自己new的我就不关了,Socket虽然不是流但他也是资源 我们需要关闭Socket s
s.close();
}
}
public class Demo01服务端 {
public static void main(String[] args) throws IOException {
//创建对象 指定了自己的端口号
ServerSocket ss = new ServerSocket(8888);
//连接上客户端
Socket s = ss.accept();
//在服务端端获取输入输出流也用的是Socket 而不是ServerSocket
//接受数据
InputStream is = s.getInputStream();
//创建字节数组
byte[] bys = new byte[1024];
//在这里我们也不能用循环,为啥不能用,下午再讲...
int len = is.read(bys);
//打印 把字节数组变成字符串输出
String str = new String(bys);
System.out.println(str);
//关资源
ss.close();
}
}
模拟网络聊天
public class Demo02客户端 {
public static void main(String[] args) throws IOException {
//创建客户端对象 指定要连接的服务器
Socket s = new Socket("192.168.23.9",8888);
//一直说话 不结束
while(true) {
//发送信息
Scanner sc = new Scanner(System.in);
String str = sc.next();
OutputStream os = s.getOutputStream();
os.write(str.getBytes());
//接受信息
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
String str2 = new String(bys, 0, len);
System.out.println(str2);
}
//s.close();
}
}
public class Demo02服务端 {
public static void main(String[] args) throws IOException {
//创建对象 指定了自己的端口号
ServerSocket ss = new ServerSocket(8888);
//连接上客户端
Socket s = ss.accept();
//死循环
while(true) {
//接受信息
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
String str = new String(bys, 0, len);
System.out.println(str);
//发送信息
Scanner sc = new Scanner(System.in);
String str2 = sc.next();
OutputStream os = s.getOutputStream();
os.write(str2.getBytes());
}
//关资源
//ss.close();
}
}
图片上传案例
public class Demo01客户端 {
public static void main(String[] args) throws IOException {
//创建客户端对象
Socket s = new Socket("192.168.23.9",9999);
//创建输入流
InputStream is = new FileInputStream("C:\\Users\\Administrator\\Desktop\\美女.jpg");
//获取输出流
OutputStream os = s.getOutputStream();
//用循环读写数据
int len;
byte[] bys = new byte[1024];
while((len=is.read(bys)) != -1){
os.write(bys,0,len);
}
//关闭资源
is.close();
s.close();
}
}
public class Demo02服务端 {
public static void main(String[] args) throws IOException {
//创建对象
ServerSocket ss = new ServerSocket(9999);
//循环
while(true) {
//连接客户端
Socket s = ss.accept();
//获取输入流
InputStream is = s.getInputStream();
//创建输出流
//在服务器中文件名称其实是生成的
//有一个办法就是使用时间的毫秒值当做文件名
long time = System.currentTimeMillis();
OutputStream os = new FileOutputStream("day12\\美女"+time+".jpg");
//循环读写
int len;
byte[] bys = new byte[1024];
while ((len = is.read(bys)) != -1) {
os.write(bys, 0, len);
}
//关闭资源
os.close();
}
//服务器对象就不关了
//ss.close();
}
}
循环发送数据的问题:
客户端读取文件读取到末尾的时候,文件会返回一个-1,客户端收到-1就结束了循环。
客户端没有通知服务器结束,导致服务器一直在等待接收数据。
解决办法:
客户端发送数据以后,调用 shutDownOutput()结束输出流,这个方法会给服务端发送-1
//告诉服务端输出数据已经结束了
s.shutdownOutput();
模拟BS结构[扩展]
//写出图片数据前先写这个:
os.write("HTTP/1.1 200 OK\r\nContent-Type:image/jpeg\r\n\r\n".getBytes());
//写出文字数据前先写这个:
os.write("HTTP/1.1 200 OK\r\nContent-Type:text/html;charset=UTF-8\r\n\r\n".getBytes());
public class Demo03服务器 {
public static void main(String[] args) throws IOException {
//1.获取浏览器发过来的数据,知道浏览器要访问的是哪个文件
//创建服务器对象
ServerSocket ss = new ServerSocket(8000);
//循环
while (true) {
//接受浏览器访问
Socket s = ss.accept();
//开启线程,这句话必须是在accept()的下面
//因为我们要有接收到了浏览器的访问再去开线程
Runnable r = new Runnable() {
@Override
public void run() {
try {
//让程序走慢一点看效率
Thread.sleep(2000);
//获取输入流
InputStream is = s.getInputStream();
//接受数据
byte[] bys = new byte[1024];
int len = is.read(bys);
String str = new String(bys, 0, len);
//从字符串中截取出文件名称
String[] arr = str.split(" ");
String name = arr[1];
System.out.println(name);
//获取输出流
OutputStream os = s.getOutputStream();
//2.要在资源文件夹里面找到对应的文件
File f = new File("day12/资源" + name); // "day12/资源/3.jpg"
if (f.exists()) {
//3.如果文件存在就把图片文件数据发给浏览器
os.write("HTTP/1.1 200 OK\r\nContent-Type:image/jpeg\r\n\r\n".getBytes());
//创建输入流
InputStream fis = new FileInputStream(f);
//循环读写
while ((len = fis.read(bys)) != -1) {
os.write(bys, 0, len);
}
//关流
fis.close();
} else {
//4.如果文件不存在就发送文字不存在
os.write("HTTP/1.1 200 OK\r\nContent-Type:text/html;charset=UTF-8\r\n\r\n".getBytes());
os.write("404文件找不到~".getBytes());
}
//关闭客户端浏览器
s.close();
} catch (Exception e) {
//大家一定要写这句话,如果不写的话,出现了异常没有打印 我们就不知道出了什么异常
e.printStackTrace();
}
}
};
//开启
Thread t = new Thread(r);
t.start();
}
}
}
总结
今天的知识点不难,只要是把代码敲一遍就好了,代码不用死机,理解就行