网络编程
第一章:网络编程基础
-
计算机网络
所谓计算机网络,就是把分布在不同区域的计算机与专门的外部设备用通信线路相互连接成一个规模大,而且功能强的网络系统,从而使得计算机之间可以相互传递信息,共享数据、软件等资源
-
网络编程
所谓网络编程,指的就是在同一个网络中不同机器之间的通信
第二章:计算机之间通信的条件
-
IP地址
IP地址指的是互联网地址(Internet Protocol Address ) ,是联网设备与互联网之间的唯一标识,在同一个网段中,IP地址是唯一的
IP地址是数字型的,是一个32位的整数,通常将其分成4个8位的二进制数,每8位之间用圆点隔开, 每个8位
整数可以转换为一个0~255的十进制整数,例如:202.9.128.88
分为IPV4和IPV6
IP地址分类
A类:保留给政府结构,1.0.0.1 ~ 126.255.255.254
B类:分配给中型企业,1.0.0.1 ~ 126.255.255.254
C类:分配给任何需要的个人,192.0.0.1 ~ 223.255.255.254
D类:用于组播,224.0.0.1 ~ 239.255.255.254
E类:用于实验,240.0.0.1 ~ 255.255.255.254
回收地址:127.0.0.1,指本地机,一般用于测试使用
IP地址可以唯一的确定网络上的一个通信实体,但一个通信实体可以有多个通信程序同时提供网络服务,此时还需要使用端口
-
端口
数据的发送和接收都需要通过端口出入计算机,端口号用于唯一标识通信实体上进行网络通讯的程序,同一台机器上不能两个程序占用同一个端口
端口号的取值范围:0~65535
端口分类:
公认端口:0~1023
注册端口:1025~49151
动态或私有端口:1024~65535
常用端口:
mysql:3306
oracle:1521
tomcat:8080
Nginx: 80
Redis:6379
Zookeeper分布式协调服务:2181
Dubbo:20880
Eurker:8761
-
协议
需要通信的设备之间需要实现相同的通信协议
网络分层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
通信协议分类:
传输层协议:TCP和UDP
网络层IP协议:IPV4和IPV6,互联网协议应用层协议:HTTP
第三章:相关类的使用
-
InetAddress类
Java提供了InetAddress类来代表ip地址,是对ip地址的抽取和封装,有两个子类:
Inet4Address,Inet6Address,分别表示IPv4和IPv6
常用方法:
//1.获取主机:主机名称和ip地址 /** * static InetAddress getLocalHost() 返回本地主机。 */ InetAddress id1 = null; try { id1 = InetAddress.getLocalHost(); //USER-VG9EDR1SST/10.31.165.42 System.out.println(id1); } catch (UnknownHostException e) { // 未知的主机 e.printStackTrace(); } //2.获取ip地址的字符串表示形式 /** * String getHostAddress() 返回 IP 地址字符串(以文本表现形式)。 */ String str1 = id1.getHostAddress(); System.out.println(str1);//10.31.165.42 //3.获取主机名 /** * String getHostName() 获取此 IP 地址的主机名。 */ String str2 = id1.getHostName(); System.out.println(str2); //4.根据主机或者ip地址获取InetAddress对象 /** * static InetAddress getByName(String host) * 在给定主机名的情况下确定主机的 IP 地址。 */ try { InetAddress id2 = InetAddress.getByName("10.31.165.42"); ///10.31.165.42 System.out.println(id2); InetAddress id3 = InetAddress.getByName("www.baidu.com"); //www.baidu.com/115.239.211.112 System.out.println(id3); } catch (UnknownHostException e) { e.printStackTrace(); } //5.根据主机或者ip地址获取所有InetAddress对象 /** * static InetAddress[] getAllByName(String host) */ try { InetAddress[] arr = InetAddress.getAllByName("www.baidu.com"); for(InetAddress address:arr) { //www.baidu.com/115.239.210.27 System.out.println(address.toString()); //115.239.210.27 System.out.println(address.getHostAddress()); //www.baidu.com System.out.println(address.getHostName()); } } catch (UnknownHostException e) { e.printStackTrace(); }
-
UELEncoder类和URLDecoder类
URLEncoder类和URLDecoder类用于完成普通字符串和application/x-www-form-urlencoded MIME字符串之间的转换
//%E5%8D%83%E9%94%8B //URLDecoder:解码,将特殊中文字符串转换为普通字符串 String string1 = URLDecoder.decode("%E5%8D%83%E9%94%8B", "utf-8"); System.out.println(string1); //URLEncoder:编码,将普通字符串转换为特殊字符串 String string2 = URLEncoder.encode("Java的开发指南", "GBK"); System.out.println(string2); //注意:编码和解码需要采用相同的字符集 String string3 = URLDecoder.decode(string2, "utf-8"); System.out.println(string3);
第四章:基于TCP的网络编程
-
概念
TCP,Transmission Control Protocol,传输控制协议,基于字节流的传输层通信协议
特点:
a.安全的
b.面向链接的
c.面向链接的
d.传输数据大小限制,一旦连接建立,双方可以按统一的格式传输大的数据
TCP的三次握手
a.客户端向服务端发送一个请求
b.服务端收到请求后,回客户端一个响应
c.客户端向收到服务端的响应后,回服务端一个确认信息
-
Socket通信模型
第五章:Socket和ServerSocket
-
互相通信
//客户端 Socket s=new Socket("10.9.46.134",9090); OutputStream os = s.getOutputStream(); os.write("涛哥牛逼".getBytes()); /*** Connection reset:连接重置 * 出现的原因: * a.如果服务端因为某种原因关闭,但是客户端仍然在访问服务端 * b.如果多个人同时访问同一个ip地址和端口的话 ** 解决办法: * 在ServerSocket服务端调用Socket类中shutdownOutput(),作用禁用输出流 */ s.shutdownOutput(); InputStream is = s.getInputStream(); byte [] b=new byte[1024]; int len; while((len=is.read(b))!=-1){ System.out.println(new String(b,0,len)); } os.close(); is.close(); //服务端 ServerSocket ss= new ServerSocket(9090); Socket acc=ss.accept(); InputStream is = acc.getInputStream(); byte [] b=new byte[1024]; int len; while((len=is.read(b))!=-1){ System.out.print(new String(b,0,len)); } OutputStream os = acc.getOutputStream(); os.write("已收到".getBytes()); os.close(); ss.close(); acc.close(); is.close();
-
上传下载
//客户端 Socket s= new Socket("10.9.46.134",9090); OutputStream os = s.getOutputStream(); FileInputStream fis=new FileInputStream("D:/IU/图片2.png"); byte [] b=new byte[1024]; int len; while((len=fis.read(b))!=-1){ os.write(b,0,len); } fis.close(); s.shutdownOutput(); InputStream is = s.getInputStream(); byte [] b2=new byte[1024]; int len2; while((len2=is.read(b2))!=-1){ System.out.println(new String(b2,0,len2)); } // os.close(); // is.close(); s.shutdownInput(); //服务器端 ServerSocket ss=new ServerSocket(9090); Socket acc = ss.accept(); InputStream is = acc.getInputStream(); FileOutputStream fos=new FileOutputStream("D:/IO/图片2.png"); byte [] b= new byte[1024]; int len ; while((len=is.read(b))!=-1){ fos.write(b,0,len); } fos.close(); acc.shutdownInput(); OutputStream os = acc.getOutputStream(); os.write("收到照片".getBytes()); acc.shutdownOutput(); // is.close(); // os.close();