核心类库 - 网络编程
一、网络常识概述
1.计算机网络
分布在不同地域的计算机,通过硬件等网络设备使用通信线路互相连接形成的一个网格系统。
计算机网络,可以很方便的进行信息的传递,资源的共享!
计算机网络让我们的生活变得越来越便捷,让人与人之间能够更方便的通信。
2.IP地址
IP地址是计算机在互联网中的唯一标识(公网IP),就像人在社会中的身份证号码。
本机IP:127.0.0.1 或 localhost ,是否插了网线都可以连接本机。
3.域名
域名可以简单的理解为IP地址的别名,更方便记忆。当输入域名后(例如www.baidu.com),计算机会访问域名解析商,然后得到IP地址,再进行访问。
4.端口号
端口号的范围是0-65535之间。
与IP地址很相似,IP地址是计算机在网络中的唯一标识。
端口号是计算机中程序的标识,用于在一台计算机中区分不同的应用程序。
端口号在使用时,应尽量避免0-1024之间的端口号,因为已经被一些知名的软件和windows操作系统所占用了。
5.通信协议
是计算机与计算机之间交流的标准,是对数据的传输速率、传入接口、步骤控制、出错控制等等制定的一套标准。
常用的通信协议:
1.http协议:超文本传输协议(80端口号)
2.https协议:安全的超文本传输协议(443端口号)
3.ftp协议:文件传输协议 21端口号
4.TCP协议:传输控制协议(Transmission Control Protocol)
5.UDP协议:用户数据报协议(User Datagram Protocol)
6.网络编程程序的分类
1.B/S 程序:浏览器与服务器程序
2.C/S 程序:客户端与服务器程序
二、TCP协议概述
TCP协议是传输控制协议(Transmission Control Protocol)。它是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
1.OSI网络模型
指的是从一台计算机的软件中,将数据发送到另一台计算机的软件中的过程。
七层网络模型:应用层 / 表现层 / 会话层 / 传输层 / 网络层 / 数据链路层 / 物理层。
2.三次握手和四次挥手
三次握手:
TCP协议客户端与服务器连接时,存在三次握手操作,确保消息能准确无误的发送。
第一次握手,客户端向服务器发出连接请求,等待服务器确认。
第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。
第三次握手,客户端再次向服务器发送确认信息,确认连接。
完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性,TCP协议可以保证传输数据的安全,所以应用非常广泛,例如:下载文件、浏览网页等。
四次挥手:
断开连接时,存在四次挥手操作。
A和B说我要断开连接了,B问你确定嘛,A说我确定,B说好的再见。
3.TCP 协议的C/S程序
需要使用到两个类,来编写TCP协议的C/S程序。
1.ServerSocket 搭建服务器
2.Socket 搭建客户端
两方使用socket(套接字,通信端点)进行交流。
三、ServerSocket类
用于创建服务器,创建完毕后,会绑定一个端口号。
然后此服务器可以等待客户端连接,服务器一定要比客户端先搭建。
每连接一个客户端,服务器就会得到一个新的Socket对象,用于跟客户端进行通信。
常用构造方法:
ServerSocket(int port)
创建一个基于TCP/IP协议的服务器,并绑定指定的端口号。注意:参数port的范围是:0-65535(建议1025-65535)。
常用方法:
1.accept()
等待客户端连接,此方法会导致线程的阻塞。直到一个新的客户端连接成功,返回Socket对象,线程继续执行。
2.close()
释放占用的端口号,关闭服务器。
3.getInetAddress()
获取连接的IP。
4.isClosed()
判断连接是否已经关闭,是则返回true,否则返回false。
四、Socket类
是两台计算机之间通信的端点,是网络驱动提供给应用程序编程的一种接口、一套标准、一种机制。
常用构造方法:
Socket(String host, int port)
创建一个套接字,并连接指定IP和端口号的服务器。参数1为服务器的IP地址,参数2为服务器软件的端口号。
常用方法:
1.getInputStream()
获取输入流。
2.getOutputStream()
获取输出流。
3.getPort()
获取连接的端口号,类型为int。
4.getInetAddress()
获取连接的IP。
5.isClosed()
判断连接是否已经关闭,是则返回true,否则返回false。
6.isConnected()
判断是否处于连接状态,是则返回true,否则返回false。
7.close()
关闭连接。
案例:
1.服务器:
public class Demo {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(55565); //搭建服务器
System.out.println("服务器启动完毕");
Socket socket = server.accept(); //等待客户端的连接
System.out.println("一个客户端连接了");
OutputStream os = socket.getOutputStream(); //获取输出流
PrintStream ps = new PrintStream(os); //将输出流转换为打印流
ps.println("欢迎你连接服务器"); //打印一行文本
InputStream is = socket.getInputStream(); //获取输入流
BufferedReader br = new BufferedReader(new InputStreamReader(is)); //将字节输入流转换为字符输入流再转换为缓存读取流
String text = br.readLine(); //读取一行文本
System.out.println("服务器接收到客户端的回复"+text);
System.out.println("服务器程序执行结束");
}
}
2.客户端:
public class ClientDemo {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",55565); //与服务器建立连接
InputStream is = socket.getInputStream(); //获取输入流
BufferedReader br = new BufferedReader(new InputStreamReader(is)); //将字节输入流转换为字符输入流再转换为缓存读取流
String text = br.readLine(); //读取一行文本
System.out.println("客户端接到消息"+text);
OutputStream os = socket.getOutputStream(); //获取输出流
PrintStream ps = new PrintStream(os); //将输出流转换为打印流
ps.println("服务器你好");
}
}
想要发消息拿输出流发,想要接消息拿输入流接。
服务器和客户端之间一定是一个在发一个在接。
如果服务器给客户端发东西客户端没接,客户端也要给服务器发东西,服务器等客户端接,客户端等服务器接,就会卡在这里。
当然,使用多线程,一个线程负责发,一个线程负责接会更好一些。
3.多线程服务器
public class Demo {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(55565); //搭建服务器
System.out.println("服务器启动完毕");
while (true) { //无限循环
Socket socket = server.accept(); //等待客户端的连接
new Thread(() -> { //有新的客户端连接,创建新的线程
try {
InputStream is = socket.getInputStream(); //获取输入流
OutputStream os = socket.getOutputStream(); //获取输出流
} catch (IOException e) {
e.printStackTrace();
}
}).start(); //启动新的线程
System.out.println("一个客户端连接了");
}
}
}
五、InetAddress类
InetAddress这个类的对象,用于描述IP。
得到InetAddress对象的方式:
InetAddress ip = InetAddress.getByName(“192.168.102.228”);
传入一个IP地址,就可以获取这个IP地址的对象。
在TCP协议中,通过套接字Socket的getInetAddress方法,可以得到连接的IP地址对象。
常用方法:
1.getHostAddress()
返回IP地址字符串。
2.getHostName()
返回计算机名称,当名称无法获取时,返回IP地址。
六、URL类
URL是统一资源定位符(Uniform Resource Locator)的简称,它表示 Internet 上某一资源的地址。通过URL用户可以访问各种网络资源,比如常见的WWW以及FTP站点。浏览器可以通过解析给定的URL在网络上查找相应的文件或其他资源。
URL 的语法格式:protocol://resourceName
协议名(protocol)指明获取资源所使用的传输协议,如HTTP、FTP和file等,资源名(resourceName)则应该是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个引用。下面是一些简单的 URL 示例:
协议名://主机名 http://www.sun.com/
协议名://机器名:端口号/文件名 http://localhost:8080/Test/admin/login.jsp
在java.net包中包含专门用来处理URL的类URL,可以获得URL的相关信息,例如URL的协议名和主机名等。
构造方法:
1.URL(String spec)
传入地址,构造一个URL对象。
常用方法:
1.getFile()
获取该URL的路径+文件名字符串。
2.openConnection()
获取通信连接URLConnection对象。
如何获取文件名称:
URL url = new URL("网址");
String name = url.getFile();
//获取文件路径+名称,并从最后一个/开始截取,截取到结尾
name = name.substring(name.lastIndexOf("/")+1,name.length());
七、URLConnection类
完成了URL的定义,接下来就可以获得URL的通信连接。在java.net包中,定义了专门的URLConnection类来表示与URL建立的通信连接,URLConnection类的对象使用URL类的openConnection()方法获得。
常用方法:
1.setDoInput(boolean doinput)
URL连接可用于输入和/或输出。如果打算使用URL连接进行输入,则传入true,否则传入false。默认值为true。
2.setDoOutput(boolean dooutput)
URL连接可用于输入和/或输出。如果打算使用URL连接进行输出,则传入true,否则传入false。默认值为false。
3.setRequestProperty(String key, String value)
设置由键值对指定的常规请求属性。如果具有密钥的属性已存在,则旧值将被新值覆盖。
4.getInputStream()
返回URL的输入流,用于读取资源。
5.getOutputStream()
返回URL的输出流,用于写入资源。
6.getContentLength()
返回头部content-length字段值,int类型。
如何关闭连接:
要关闭连接,需要使用从连接中获取的InputStream或OutputStream对象,在这两个对象上调用 close()方法。这样做可以释放与URLConnection实例关联的网络资源。
八、HttpURLConnection类
HTTP(HyperText Transfer Protocol)协议是超文本传输协议,是TCP/IP协议集中的协议,是一个简单的请求-响应协议,指定了客户端发送给服务器的消息以及服务器的响应。所有的WWW文件都必须遵守这个标准。
如果URL中使用的网络协议为HTTP协议或HTTPS协议,就可以将URLConnection类型强制转换为HttpURLConnection。
常用方法:
1.getResponseCode()
返回服务器发送的HTTP状态码,int类型。
2.setRequestMethod(String method)
设置URL请求的方法,它是HTTP方法GET、POST、HEAD、OPTIONS、PUT、DELETE和TRACE之一。默认方法是GET(注意:这里方法类型必须大写)。
九、URL编码
在Java开发中,有时候需要将中文进行转码,保证传输的时候不出现乱码。最常用的方式是URLEncode与URLDecode。
URLEncode:
将普通字符串转换成application/x-www-from-urlencoded字符串。
字符串中的非西欧字符的内容,会被转化成%XX%XX,XX为十六进制的数字。
String urlString = URLEncoder.encode("你好", "UTF-8");
System.out.println(urlString); //%E4%BD%A0%E5%A5%BD
URLDecode:
将application/x-www-from-urlencoded字符串转换成普通字符串
String keyWord = URLDecoder.decode("%E4%BD%A0%E5%A5%BD", "UTF-8");
System.out.println(keyWord); //你好