Java - 核心类库 - 网络编程

核心类库 - 网络编程

一、网络常识概述

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); //你好
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值