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

原文地址:https://www.cnblogs.com/xiaochenztx/p/8520393.html

时间: 2024-10-15 20:32:00

Java网络编程一的相关文章

Java网络编程一:基础知识详解

网络基础知识 1.OSI分层模型和TCP/IP分层模型的对应关系 这里对于7层模型不展开来讲,只选择跟这次系列主题相关的知识点介绍. 2.七层模型与协议的对应关系 网络层   ------------     IP(网络之间的互联协议) 传输层   ------------     TCP(传输控制协议).UDP(用户数据报协议) 应用层   ------------     Telnet(Internet远程登录服务的标准协议和主要方式).FTP(文本传输协议).HTTP(超文本传送协议) 3

java网络编程之UDP实例

package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgram { public static DatagramPacket toDatagram(String s, InetAddress destIA, int destPort) { byte[] buf = new byte[s.length() + 1]; s.getBytes(0, s.length(), b

java网络编程之TCP实例

Dgram类 package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgram { public static DatagramPacket toDatagram(String s, InetAddress destIA, int destPort) { byte[] buf = new byte[s.length() + 1]; s.getBytes(0, s.leng

黑马程序员——Java网络编程之UDP传输

网络编程 网络模型 通讯要素:InetAddress(对象):ip地址,网络中设备的标识,不可记忆,可用主机名,本地回环地址:127.0.0.1主机名localhost 端口号 传输协议:UDP,将数据的源及目的封装成数据包中,不需要建立连接,每个数据包的大小限制在64K内,无连接,是不可靠协议,不需要建立连接,速度快.力求速度,不求数据的准确性.比如聊天软件,网络会议. TCP:建立连接,形成传输数据的通道,在连接中进行大数据量传输,通过三次握手完成连接,是可靠协议,必须建立连接效率稍低. S

【转】JAVA网络编程之Socket用法

JAVA网络编程之Socket用法 分类: JAVA2012-08-24 15:56 710人阅读 评论(0) 收藏 举报 在客户/服务器通信模式中,客户端需要主动建立与服务器连接的Socket,服务器端收到客户端的连接请求,也会创建与客户端连接的Socket.Socket可以看做是通信连接两端的收发器,客户端和服务店都通过Socket来收发数据. 1.构造Socket public Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字 public Socket(Str

Java网络编程之Socket通信(二)

之前在前面已经介绍了Socket通信的一些基本原理,以及如何让客户端与服务器端建立通信,和实现通信的一些基本步骤(包括首先使得服务器端与客户端建立连接,建立连接之后,服务器端开始侦听客户端的请求,侦听到客户端的请求之后,通过输入输出流处理相关信息实现通信,最后通信完毕结束通信等一系列流程). 但是之前只是单个客户端与服务器进行通信,而我们实际应用中单个客户端的情况几乎不存在,都是多个客户端同时与服务器进行交互(这里同时交互就会出现并发性的问题,对于并发性的问题暂时还不是很懂,只知道有这个概念),

Java网络编程之TCP、UDP

Java网络编程提供了两种协议:TCP(传输控制协议)和UDP(数据报协议).TCP(Transmission Control Protocol)是一种可靠的传输协议,传输时会采用"三次握手"端的方式建立连接,以保证数据的可靠性和安全性:而UDP(User Datagram Protocol)协议是一种不可靠的传输协议,发送的数据不一定能够接受的到,网上的聊天是工具一般采用的此协议.下面将详细的接受TCP和UDP的使用以及相应的编码. 一.TCP网络通信 Java中使用Socket(套

浅析Java网络编程之UDP传输(一)

网络传输方式一般有两种--TCP和UDP.本文用于简单了解一下UDP传输方式. 一.UDP有何特点? 1.面向无连接的: 2.面向报文的,且每一份报文不超过64KB: 3.不可靠但高效(不用建立连接): 4.支持一对一.一对多.多对一.多对多的交互通讯: 对于这些特点,没有什么为什么,事实而已啦! 二.在Java中怎么玩UDP? 在Java中,将建立UDP服务相关操作封装到了DatagramSocket类中,将数据报相关操作封装到了DatagramPacket类中. 三.具体玩的思路是什么? U

Java网络编程之TCP通信

一.概述 Socket类是Java运行clientTCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信. Socket类的方法会建立和销毁连接,设置各种Socket选项. ServerSocket类是Java执行server端操作的基础类,该类执行于server,监听入站TCP连接.每一个socketserver监听server的某个port.当远程主机的client尝试连接此port时.server就被唤醒.并返回一个表示两台主机之间socket的正常Socket对象.