导读:
1.网络:
将不同区域的计算机群和外部设备通过通信设备组成的网络集群,按大小可分为局域网,城域网,广域网(互联网)。
2.地址:
ip地址:确定网络上的一个绝对地址,位置->相当于房子的地址
3.端口号:
用于区分计算机软件->相当于房子的房门号 ->2个字节 0-65535,共65536个端口号
(1)在同一个协议下端口号不可重复,不同协议下可以重复
(2)1024以下的尽量避免使用
4.资源定位:
URL统一资源定位符:URI->统一资源
5.数据的传输
(1)协议:
1)TCP:类似电话,三次握手,面向连接,安全可靠,效率低下,基于字节流
2)UDP:类似短信 ,面向无连接,效率高,数据可能丢失
(2)传输:
1)先封装
2)后拆封
相关类:
1.InetAddress(封装计算机的IP地址和DNS,没有端口) ->InetSocketAddress
(1)方法:
getHostAddress()返回IP地址
getHostName()返回域名/本机为计算机名
2.URL
由四部分组成:协议 ->存放资源的主机域名 ->端口号->资源文件名
(1)创建:
URL url=new URL(String url);绝对路径
URL url=new URL(URL context,String url);相对路径
(2)方法:
URL url=new URL("https://piaofang.maoyan.com/dashboard?date=2019-01-02");
System.out.println("协议:"+url.getProtocol());
System.out.println("存放资源的主机域名:"+url.getHost());
System.out.println("端口号:"+url.getPort());
System.out.println("资源文件名:"+url.getFile());
System.out.println("参数:"+url.getQuery());
System.out.println("锚点:"+url.getRef());
3.TCP:ServerSocket ->Socket
4.UDP:DatagramSocket ->DatagramPacket
(1)客户端:
1)创建客户端:DatagramSocket +指定端口
2)准备数据 : 字节数组
3)打包: DatagramPacket + 服务器地址+端口
4)发送:
5)释放资源:
(2)服务器端:
1)创建服务端: DatagramSocket +指定端口
2)准备接收容器: 字节数组 封装 DatagramPacket
3)封装成包:-》接收数据
4)分析:
5)释放资源:
上代码了解一下:
1.InetAddress
1 package com.etc; 2 3 import java.net.InetAddress; 4 import java.net.InetSocketAddress; 5 import java.net.UnknownHostException; 6 7 8 public class InetDemo { 9 public static void main(String[] args) throws UnknownHostException { 10 11 /*InetAddress ip=InetAddress.getLocalHost();两种方法均可以获得指定的主机名对应的IP地址*/ 12 InetAddress ip=InetAddress.getByName("逐梦青空"); 13 //本机名称 14 System.out.println(ip.getHostName()); 15 //获取的是 IPv4 地址 16 System.out.println(ip.getHostAddress()); 17 System.out.println("****************"); 18 19 InetSocketAddress id=new InetSocketAddress("逐梦青空",8080); 20 21 System.out.println(id.getAddress()); 22 System.out.println(id.getHostString()); 23 System.out.println(id.getHostName()); 24 //以上三种方法均可以获得对应ip地址下的主机名 25 System.out.println(id.getPort()); 26 } 27 }
效果截图:
2.InetSocketAddress
1 package com.etc; 2 3 import java.net.InetSocketAddress; 4 /* 5 * 套接字socket,包含端口并将其加以封装 6 * InetSocketAddress isa=new InetSocketAddress(String hostname,int port); 7 */ 8 public class InetSocketDemo { 9 public static void main(String[] args) { 10 //不仅可以封装ip地址和DNS,还可以封装port即端口号 11 InetSocketAddress isa=new InetSocketAddress("逐梦青空",8080); 12 System.out.println("端口号:"+isa.getPort()+";地址: "+isa.getAddress()+";主机名:"+isa.getHostName()); 13 14 } 15 }
效果截图:
3.URL
1 package com.etc; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.InputStreamReader; 8 import java.io.OutputStreamWriter; 9 import java.net.URL; 10 11 public class URLDemo { 12 13 public static void main(String[] args) throws IOException { 14 15 URL url=new URL("https://photo.fengniao.com/f_15.html"); 16 System.out.println("协议:"+url.getProtocol()); 17 System.out.println("存放资源的主机域名:"+url.getHost()); 18 System.out.println("端口号:"+url.getPort()); 19 System.out.println("资源文件名:"+url.getFile()); 20 System.out.println("参数:"+url.getQuery()); 21 System.out.println("锚点:"+url.getRef()); 22 23 //利用openStream()方法返回输入流资源 24 BufferedReader bf=new BufferedReader(new InputStreamReader(url.openStream(),"utf-8")); 25 //信息重组以文件形式返回 26 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("蜂鸟.html"),"utf-8")); 27 //利用循环读取输入流信息 28 String msg=null; 29 while((msg=bf.readLine())!=null) { 30 bw.append(msg); 31 bw.newLine(); 32 33 } 34 //关闭流 35 bf.close(); 36 bw.close(); 37 } 38 39 }
效果截图:
4.UDP
(1)客户端
1 package com.test; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.net.InetSocketAddress; 7 import java.net.SocketException; 8 9 /* 10 * 1)创建客户端:DatagramSocket +指定端口 11 * 2)准备数据 : 字节数组 12 * 3)打包: DatagramPacket + 服务器地址+端口 13 * 4)发送: 14 * 5)释放资源: 15 */ 16 public class Myclient { 17 18 public static void main(String[] args) throws IOException { 19 //创建客户端 20 DatagramSocket client=new DatagramSocket(6666); 21 //准备数据 : 字节数组 22 String msg="我很喜欢敲代码!"; 23 byte[] by=msg.getBytes(); 24 //打包: DatagramPacket + 服务器地址+端口 25 //DatagramPacket(byte buf[], int offset, int length, InetAddress address, int port) 26 DatagramPacket packet=new DatagramPacket(by,by.length,new InetSocketAddress("逐梦青空",8888)); 27 //发送: 28 client.send(packet); 29 //释放资源 30 client.close(); 31 } 32 33 }
(2)服务器端
1 package com.test; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.net.SocketException; 7 8 /* 9 * 1)创建服务端: DatagramSocket +指定端口 10 * 2)准备接收容器: 字节数组 封装 DatagramPacket 11 * 3)封装成包:-》接收数据 12 * 4)分析: 13 * 5)释放资源: 14 */ 15 public class Myserver { 16 17 public static void main(String[] args) throws IOException { 18 //创建服务端 19 DatagramSocket server=new DatagramSocket(8888); 20 //准备接收容器 1M 21 byte[] by=new byte[1024*1024]; 22 //包 23 DatagramPacket packet=new DatagramPacket(by,by.length); 24 //接收数据 25 server.receive(packet); 26 //分析: 27 byte[] data=packet.getData(); 28 int len=packet.getLength(); 29 System.out.println(new String(data,0,len)); 30 //释放资源 31 server.close(); 32 } 33 34 }
效果截图:
ps:文章待完善,后续会加以修改。
原文:https://www.cnblogs.com/weekstart/p/10826900.html