Java网络编程一
Posted 啸辰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java网络编程一相关的知识,希望对你有一定的参考价值。
71.Java网络支持提供了 java.net包 ********************************************************************(由于电脑原因困扰我半上午,,,,)java中package问题理解:
2.InetAddress包括两个子类 Inet4Address Inet6Address 在写类时如果指定了package,则必须把生成的.class文件放到package对应的文件夹下,运行时
2.1该类无没有提供构造器,用两个静态方法获取实例 还需要加上包名,而且还要在package包指定的路径同层上运行,如果进入包文件夹下也会报错
getByName(String host) :host为主机名 显示找不到或无法加载,,,
getByAddress(byte[] addr):根据IP地址获取实例 运行时jvm要加载该类,首先搜索配置的ClassPath下的路径,所以还配置ClassPath要在当前路径
2.2该类提供3个方法获取InetAddress对应IP地址和主机名 下搜索,一个点(用IDE工具好像不会出现这种问题,我用的EditPlus)
String getCanonicalHostName();返回全限定域名
String getHostAddress(): 返回对应主机IP地址字符串
String getHostName():获取主机名
getLocalHost()获取本地主机ip地址对应的InetAddress实例
isReachable():测试是否能到达该地址
代码:
1 import java.net.*; 2 3 public class NetTest1{ 4 public static void main(String[] args) throws Exception 5 { 6 InetAddress ip = InetAddress.getByName("www.henu.edu.cn"); 7 8 System.out.println("是否可达:"+ip.isReachable(200)); 9 10 System.out.println(ip.getHostAddress()); 11 12 System.out.println(ip.getCanonicalHostName()); 13 14 System.out.println(ip.getHostName()); 15 16 } 17 }
运行结果:
1 是否可达:true 2 202.196.96.199 3 202.196.96.199 4 www.henu.edu.cn 5 请按任意键继续. . .
3.URLDecoderd和URLEncoder 完成普通字符串和MIME字符串间的转换
URLDecoder.decode(String s, String enc);将经过decoder的s按enc指定的编码,转换成普通字符串
URLEncoder.encoder(String s, String enc);和上面相反
代码:
1 import java.net.*; 2 3 public class UrlDecodeTest1{ 4 public static void main(String[] args) throws Exception 5 { 6 String s = "notepad%2B%2B%E5%86%99java%E4%BB%A3%E7%A0%81%E6%97%B6%E5%87%BA%E7%8E%B0%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81"; 7 String key = URLDecoder.decode(s,"utf-8"); 8 System.out.println(key); 9 10 String s1 = "张天啸"; 11 12 String urlS1 = URLEncoder.encode(s1,"GBK"); 13 14 System.out.println(urlS1); 15 } 16 }
running:
notepad++写java代码时出现中文乱码 %D5%C5%CC%EC%D0%A5 请按任意键继续. . .
4.URL URLConnection URLPermission
URL对象代表统一资源定位器,是指向互联网资源的指针,由协议名,主机名,端口号,资源组成
格式:protocol://host:port/resourceName
(URI统一资源标识符,唯一作用就是解析,URL可以打开到达该资源的输入流
URL提供了多个构造器,获得对象后,可以调用以下的方法
*******环境变量这点破事还弄不对了,,,,,,,等我缓缓回去用自己电脑试试*****************
目前代码:一旦加上指定包名就会报找不到主类的错
1 //下载工具类 2 package zhang; 3 4 import java.net.*; 5 6 public class DownUtil{ 7 private String path;//定义资源下载的路径 8 9 private String targetFile;//指定文件保存的位置 10 11 private int threadNum;//定义下载线程数 12 13 private DownThread[] threads;//定义下载线程下载对象,内部类 14 15 private int fileSize; //下载文件的大小 16 17 public void DownUtil(String path, String targetFile, int threadNum) 18 { 19 this.path = path; 20 this.targetFile = targetFile; 21 this.threadNum = threadNum; 22 threads = new DownThread[threadNum]; 23 } 24 25 private class DownThread extends Thread 26 { 27 private int startPos;//当前线程下载的位置 28 29 private int currentPartSize;//当前线程负责下载的文件大小 30 31 32 } 33 34 }
RandomAccessFile的用法:https://www.cnblogs.com/baoliyan/p/6225842.html 在java.io包下面
RandomAccessFile是Java输入/输出流体系中功能最丰富的文件内容访问类,既可以读取文件内容,也可以向文件输出数据。与普通的输入/输出流不同的是,RandomAccessFile支持跳到文件任意位置读写数据,RandomAccessFile对象包含一个记录指针,用以标识当前读写处的位置,当程序创建一个新的RandomAccessFile对象时,该对象的文件记录指针对于文件头(也就是0处),当读写n个字节后,文件记录指针将会向后移动n个字节。除此之外,RandomAccessFile可以自由移动该记录指针
RandomAccessFile包含两个方法来操作文件记录指针:
- long getFilePointer():返回文件记录指针的当前位置
- void seek(long pos):将文件记录指针定位到pos位置
RandomAccessFile类在创建对象时,除了指定文件本身,还需要指定一个mode参数,该参数指定RandomAccessFile的访问模式,该参数有如下四个值:
- r:以只读方式打开指定文件。如果试图对该RandomAccessFile指定的文件执行写入方法则会抛出IOException
- rw:以读取、写入方式打开指定文件。如果该文件不存在,则尝试创建文件
- rws:以读取、写入方式打开指定文件。相对于rw模式,还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备,默认情形下(rw模式下),是使用buffer的,只有cache满的或者使用RandomAccessFile.close()关闭流的时候儿才真正的写到文件
- rwd:与rws类似,只是仅对文件的内容同步更新到磁盘,而不修改文件的元数据
看着书上写了一个多线程下载的代码:包含一个工具类DownUtil,和调用该类的ThreadDown类
首先创建DownUtil类的对象时要传3个参数,1,所下载文件的URL,2,在本地保存该文件的的文件名,3想要启动下载线程的数量
通调用该类的download()方法:通过提供的path先建立了URL对象,然后调用openConnection()得到HttpURLConnection(),设置请求的各种参数,建立连接,获取文件大小,将文件分块,计算每个块的开始位置,和块的大小,然后新建线程,启动下载,里面有个内部类,继承Thread实现run方法
文件RandomAccessFile很有用
代码:
1 //下载工具类 2 package zhang; 3 4 import java.io.*; 5 6 import java.net.*; 7 8 public class DownUtil{ 9 private String path;//定义资源下载的路径 10 11 private String targetFile;//指定文件保存的位置 12 13 private int threadNum;//定义下载线程数 14 15 private DownThread[] threads;//定义下载线程下载对象,内部类 16 17 private int fileSize; //下载文件的大小 18 19 public DownUtil(String path, String targetFile, int threadNum) 20 { 21 this.path = path; 22 this.targetFile = targetFile; 23 this.threadNum = threadNum; 24 threads = new DownThread[threadNum]; 25 } 26 27 public void download() throws Exception 28 { 29 URL url = new URL(path); 30 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 31 conn.setConnectTimeout(5*1000); 32 conn.setRequestMethod("GET"); 33 conn.setRequestProperty("Accept","image/gif, image/jpeg,image/pjpeg,*/*"); 34 conn.setRequestProperty("Accept-Language","zh-CN"); 35 conn.setRequestProperty("Charaset","utf-8"); 36 conn.setRequestProperty("Connection","Keep-Alive"); 37 38 fileSize = conn.getContentLength(); 39 conn.disconnect(); 40 41 int currentPartSize = fileSize / threadNum+1; 42 43 RandomAccessFile file = new RandomAccessFile(targetFile,"rw"); 44 45 file.setLength(fileSize); 46 47 file.close(); 48 49 for(int i = 0; i < threadNum; i++) 50 { 51 int startPos = i * currentPartSize; 52 53 RandomAccessFile currentPart = new RandomAccessFile(targetFile,"rw"); 54 55 currentPart.seek(startPos); 56 57 threads[i] = new DownThread(startPos,currentPartSize,currentPart); 58 59 threads[i].start(); 60 } 61 62 } 63 64 public double getCompleteRate() 65 { 66 int sumSize = 0; 67 for(int i = 0; i < threadNum; i++) 68 { 69 sumSize += threads[i].length; 70 } 71 return sumSize*1.0/fileSize; 72 } 73 74 private class DownThread extends Thread 75 { 76 private int startPos;//当前线程下载的位置 77 78 private int currentPartSize;//当前线程负责下载的文件大小 79 80 private RandomAccessFile currentPart;//当前线程需要下载的文件快 81 82 public int length; 83 84 public DownThread(int startPos, int currentPartsize,RandomAccessFile currentPart) 85 { 86 this.startPos = startPos; 87 this.currentPartSize = currentPartsize; 88 this.currentPart = currentPart; 89 } 90 91 public void run() 92 { 93 try 94 { 95 URL url = new URL(path); 96 HttpURLConnection conn =(HttpURLConnection)url.openConnection(); 97 98 conn.setConnectTimeout(5*1000); 99 conn.setRequestMethod("GET"); 100 conn.setRequestProperty("Accept","image/gif, image/jpeg,image/pjpeg,*/*"); 101 conn.setRequestProperty("Accept-Language","zh-CN"); 102 conn.setRequestProperty("Charaset","utf-8"); 103 104 InputStream inStream = conn.getInputStream(); 105 106 inStream.skip(this.startPos); 107 108 byte[] buff = new byte[1024]; 109 110 int hasRead = 0; 111 112 while(length < currentPartSize && (hasRead = inStream.read(buff)) != -1) 113 { 114 currentPart.write(buff,0,hasRead); 115 length += hasRead; 116 } 117 118 currentPart.close(); 119 inStream.close(); 120 121 } 122 catch (Exception e) 123 { 124 } 125 } 126 127 128 129 130 } 131 132 }
调用代码:
1 package zhang; 2 3 public class ThreadDown 4 { 5 public static void main(String[] args) throws Exception 6 { 7 System.out.println("Hello World!"); 8 DownUtil d = new DownUtil("http://pic.sc.chinaz.com/files/pic/pic9/201803/bpic6017.jpg","first2.jpg",4); 9 d.download(); 10 11 new Thread(() -> { 12 while(d.getCompleteRate() < 1) 13 { 14 System.out.println("已完成:"+d.getCompleteRate()); 15 try 16 { 17 Thread.sleep(10); 18 } 19 catch (Exception e) 20 { 21 System.out.println("异常:main"); 22 } 23 } 24 }).start(); 25 } 26 }
运行结果:
E:\\java\\java_test\\netprogram>java zhang.ThreadDown Hello World! 已完成:0.0 已完成:0.0 已完成:0.0 已完成:0.0 已完成:0.0 已完成:0.0 已完成:0.0 已完成:0.0 已完成:0.10132840263844631 已完成:0.15504150438648256 已完成:0.15504150438648256 已完成:0.15504150438648256 已完成:0.15504150438648256 已完成:0.262467707882555 已完成:0.3143711396986506 已完成:0.3143711396986506 已完成:0.3143711396986506 已完成:0.44026122192061057 已完成:0.44026122192061057 已完成:0.44026122192061057 已完成:0.44026122192061057 已完成:0.44026122192061057 已完成:0.44026122192061057 已完成:0.44026122192061057 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.6739053463944293 已完成:0.7813315498905019 已完成:0.7813315498905019 已完成:0.7813315498905019 已完成:0.9180534246036429
以上是关于Java网络编程一的主要内容,如果未能解决你的问题,请参考以下文章