2020/8/22
1.Junit
-
Junit叫单元测试,用来对方法进行测试,可以替代之前的main()方法。
-
Junit也是一个第三方工具,也需要导入jar包,需要版本统一,我们用的是4.XXX版本的unit。
1.概述
-
基本演示
import org.junit.Test; public class Test01 { @Test public void addTest(){ System.out.println(add(3,4)); } public int add(int a,int b){ return a+b; } }
2.常用注解
-
注解
@Test 单元测试,专门对方法进行测试,单元测试的方法不能有参数和返回值 @before 被修饰的方法会在测试方法之前执行 @after 被修饰的方法会在测试方法之后执行 @BeforeClass 必须是静态方法,在所有方法执行前执行 @AfterClass 必须是静态方法,在所有方法之后执行
-
代码演示
import org.junit.*; public class Test02 { //单元测试,专门对方法进行测试 @Test public void addTest() { int add = add(3, 4); System.out.println(add); } @Test public void addTest2() { int add = add(3, 5); System.out.println(add); } @Before public void method1() { System.out.println(1); } @After public void method2() { System.out.println(2); } @BeforeClass public static void method3() { System.out.println(3); } @AfterClass public static void method4() { System.out.println(4); } //求两个整数的和 public int add(int a, int b) { int c = a + b; return c; } }
3.断言
-
作用
- Junit只能检查异常和错误,不能检查逻辑错误,此时可以使用断言来判断。
- 我们给定一个期望值,和程序的结果进行比较判断,如果期望值和结果一样就会出现绿色,如果不一样就出现红色。
-
代码演示
import org.junit.Assert; import org.junit.Test; public class Test03 { @Test public void test(){ Assert.assertEquals(7,sub(11,4)); } public int sub(int a,int b){ return a-b; } }
2.网络编程入门
1.软件结构
- B/S结构
- 浏览器/服务器,比如淘宝、京东、世纪佳缘、qq空间
- 优缺点
- 优点:不用下载、开发和维护方便
- 缺点:功能有局限,对网络要求大
- C/S结构
- 客户端/服务器,比如QQ、英雄联盟、共屏软件
- 优缺点
- 优点:功能比较细致,对网络要求低
- 缺点:开发和维护复杂,占用空间
2.网络编程三要素
-
IP地址:
-
IP地址是网络上面设备的唯一标识
查看ip:cmd里面输入ipconfig - ipv4 是一个32位的二进制数,通常被分为4个字节 - ipv6 采用128位地址长度,每16个字节一组,分为8位十六进制数 在代码中可以表示主机ip:127.0.0.1 localhost
-
-
端口号
- 端口号是软件的唯一标识,0-65535
-
建议大家不要用0-1023这个范围内的端口号,通常被系统所占用
-
协议
- 协议是网络上数据传输的规则
- TCP协议
- 面向连接,效率低,数据安全
- 通过三次握手保证连接
- UDP协议
- 面向无连接,效率高,数据不安全,数据有大小的限制,在64k以内
3.InetAddress类
-
用来表示设备的IP
-
方法介绍
InetAddress类成员方法 * static InetAddress getLocalHost() 获得本地主机IP地址对象 * static InetAddress getByName(String host) 根据IP地址字符串或主机名获得对应的IP地址对象 * String getHostName() 获得主机名 * String getHostAddress() 获得IP地址字符串
-
代码演示
import java.net.InetAddress; import java.net.UnknownHostException; public class Test04 { public static void main(String[] args) throws UnknownHostException { //获得本机的ip地址对象 InetAddress ip1 = InetAddress.getLocalHost(); System.out.println(ip1); //获得网络上的IP对象 InetAddress ip2 = InetAddress.getByName("192.168.14.35"); System.out.println(ip2); //获得主机名 String name = ip2.getHostName(); System.out.println(name); //获得ip地址 String address = ip2.getHostAddress(); System.out.println(address); } }
3.TCP通信
1.TCP操作概述
- 在java中,类叫做Socket底层是使用TCP协议所实现的,Socket也叫做套接字,可以实现网络中的数据交互。
2.TCP通信案例一
-
客户端发送数据
import java.io.IOException; import java.io.OutputStream; import java.net.Socket; public class Test客户端 { public static void main(String[] args) throws IOException { Socket s = new Socket("192.168.227.1", 8888); OutputStream os = s.getOutputStream(); os.write("你好,今晚一起看电影吗?".getBytes()); os.close(); s.close(); } }
-
服务器接收数据
import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class Test服务器 { public static void main(String[] args) throws IOException { ServerSocket ss = new ServerSocket(8888); Socket s = ss.accept(); 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); is.close(); s.close(); //ss.close(); } }
3.TCP模拟聊天
-
客户端代码
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner; public class Test客户端 { public static void main(String[] args) throws IOException { Socket s = new Socket("192.168.227.1", 8888); while (true) { OutputStream os = s.getOutputStream(); os.write(new Scanner(System.in).nextLine().getBytes()); 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); } //is.close(); //os.close(); //s.close(); } }
-
服务器代码
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class Test服务器 { 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); OutputStream os = s.getOutputStream(); os.write(new Scanner(System.in).nextLine().getBytes()); } //is.close(); //s.close(); //ss.close(); } }
4.文件上传案例
- 图解
-
代码实现
-
客户端发送文件
import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; public class Test客户端 { public static void main(String[] args) throws IOException { Socket s = new Socket("192.168.14.35", 8888); OutputStream os = s.getOutputStream(); FileInputStream fis = new FileInputStream("day12\\资源\\1.jpg"); byte[] bys = new byte[1024]; int len; while((len = fis.read(bys)) !=-1){ os.write(bys,0,len); } os.close(); fis.close(); s.close(); } }
-
服务器接受文件
import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class Test服务器 { public static void main(String[] args) throws IOException { ServerSocket ss = new ServerSocket(8888); while (true) { Socket s = ss.accept(); InputStream is = s.getInputStream(); FileOutputStream fos = new FileOutputStream("D:\\图片" + System.currentTimeMillis() + ".jpg"); byte[] bys = new byte[1024]; int len; while ((len = is.read(bys)) != -1) { fos.write(bys, 0, len); } fos.close(); is.close(); s.close(); } } }
-
-
循环发送数据的问题
在客户端从文件读取到-1之后,客户端循环就结束了,没有给服务器发送-1,导致服务器循环无法结束。在客户端发送数据结束之后调用 s.shutdownOutput(),来通知服务器输出结束了。
//客户端 import java.io.FileInputStream; 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 { Socket s = new Socket("192.168.14.35", 8888); OutputStream os = s.getOutputStream(); FileInputStream fis = new FileInputStream("day12\\资源\\1.jpg"); byte[] bys = new byte[1024]; int len; while((len = fis.read(bys)) !=-1){ os.write(bys,0,len); } s.shutdownOutput();//作用就是输出-1 InputStream is = s.getInputStream(); while ((len=is.read(bys))!=-1) { String str = new String(bys, 0, len); System.out.println(str); } is.close(); os.close(); fis.close(); s.close(); } } //服务器 import java.io.FileOutputStream; 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 { ServerSocket ss = new ServerSocket(8888); while (true) { Socket s = ss.accept(); InputStream is = s.getInputStream(); FileOutputStream fos = new FileOutputStream("D:\\图片" + System.currentTimeMillis() + ".jpg"); byte[] bys = new byte[1024]; int len; while ((len = is.read(bys)) != -1) { fos.write(bys, 0, len); } OutputStream os = s.getOutputStream(); os.write("上传成功".getBytes()); os.close(); fos.close(); is.close(); s.close(); } } }
4.模拟B/S服务器
- B/S结构的模式图解
-
B/S模式是web的内容,以下是服务器需要给浏览器发送的相影信息,在正式传输数据前,要先写这个。
发送图片: "HTTP/1.1 200 OK\r\nContent-Type:image/jpeg\r\n\r\n" 发送文字时: "HTTP/1.1 200 OK\r\nContent-Type:text/html;charset=UTF-8\r\n\r\n"
-
服务器代码
import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Test服务器 { public static void main(String[] args) throws IOException { ServerSocket ss = new ServerSocket(8888); while (true) { Socket s = ss.accept(); 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(" "); File f = new File("day12/资源" + arr[1]); System.out.println(str); if (f.exists()) { OutputStream os = s.getOutputStream(); FileInputStream fis = new FileInputStream(f); os.write("HTTP/1.1 200 OK\r\nContent-Type:image/jpeg\r\n\r\n".getBytes()); while ((len = fis.read(bys)) != -1) { os.write(bys, 0, len); } os.close(); fis.close(); } else { OutputStream os = s.getOutputStream(); os.write("HTTP/1.1 200 OK\\r\\nContent-Type:text/html;charset=UTF-8\\r\\n\\r\\n".getBytes()); os.write("404·你访问的资源不在".getBytes()); os.close(); } s.close(); } } }
-
多线程写法
import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Test多线程写法 { public static void main(String[] args) throws IOException { ServerSocket ss = new ServerSocket(8888); while (true){ Socket s = ss.accept(); new Thread(()->{ try{ 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(" "); File f = new File("day12/资源" + arr[1]); //System.out.println(str); if (f.exists()) { OutputStream os = s.getOutputStream(); FileInputStream fis = new FileInputStream(f); os.write("HTTP/1.1 200 OK\r\nContent-Type:image/jpeg\r\n\r\n".getBytes()); while ((len = fis.read(bys)) != -1) { os.write(bys, 0, len); } fis.close(); os.close(); } else { OutputStream os = s.getOutputStream(); os.write("HTTP/1.1 200 OK\r\nContent-Type:text/html;charset=UTF-8\r\n\r\n".getBytes()); os.write("404~你访问的资源不在".getBytes()); os.close(); } s.close(); }catch (Exception e){ } }).start(); } } }