网络编程_Java(一)

·TCP/IP协议:

传输控制协议/因特网互联协议(Transmission Control Protocol/Internet Protocol)。它定义了计算机如何连入因特网,以及数据如何在他们之间传输的标准。它采用了4层的分层模型:

1.链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。
2.网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
3.传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。
4.应用层:主要负责应用程序的协议,例如HTTP协议,PTF协议等。

·网络通信协议的分类:

1-- UDP:用户数据报协议(User Datagram Protocal)。【数据报(Datagram):网络传输的基本单位】
  1. UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。

  2. 由于使用UDP协议消耗资源少,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接受结果产生太大影响。

  3. 但是在使用UDP协议传送数据时,由于UDF的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。UDP的交换过程如下图所示:
    在这里插入图片描述

    注意:其数据被限制在64KB以内,超出这个范围就不能发送了。

2-- TCP:传输控制协议(Transmission Control Protocol)。
  1. TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
  2. 在TCP连接中必须要明确客户端与服务器端,由客户端向服务器端发送连接请求,每次连接的创建都需要经过“三次握手”:
    1-- 第一次握手:客户端向服务器端发出连接请求,等待服务器确认。
    2-- 第二次握手:服务器端向客户端回送一个响应,通知客户端收到了连接请求。
    3-- 第三次握手:客户端再次向服务器端发送确认信息,确认连接。

整个交互过程如下图所示:
在这里插入图片描述


·网络编程三要素:

1-- 协议
2-- IP地址:互联网协议地址(Internet Protocol Address )
  1. IP地址用来给一个网络中的计算机设备做唯一的编号。如果把“个人电脑”比作“一台电话”的话,那么“IP地址”相当于“电话号码”。
  2. IP地址分类:
    1-- IPv4: 【4代表4个字节】是一个32位的二进制数,通常被分成4个字节,表示成a.b.c.d的形式,例如:192.168.65.100,其中a,b,c,d都是0-255之间的十进制整数,那么最多可以表示42亿个。
    2-- IPv6: 【6代表16个字节】网络地址资源有限—扩大地址空间—拟通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组。分成8组16进制数,表示成:ABCD:EF01:2345:6789: ABCD:EF01:2345:6789
  3. 常用命令:
    1-- 查看本机IP地址:ipconfig
    2-- 检查网络是否连通:ping 空格 IP地址【例如:ping 220.181.57.216】
  4. 特殊的IP地址:
    —本机IP地址:127.0.0.1、localhost
    ·
3-- 端口号
  1. 端口号是一个逻辑端口,我们无法直接看到,可以使用一些软件查看端口号。
  2. 当我们使用网络软件一打开,那么操作系统就会为网络软件分配一个随机的端口号,或者网络软件在打开的时候和系统要指定的端口号。
  3. 端口号是由两个字节组成,取值范围在0-65535之间【注意:1024之前的端口号我们不能使用,已经被系统分配给已知的网络软件了;网络软件的端口号不能重复】
  4. 常用的端口号:
    1-- 80端口:网络端口 www.baidu.com:80正确的网址
    2-- 数据库: mysql:3306; Oracle:1521
    3-- Tomcat服务器:8080

TCP通信程序

两端【客户端,服务端】通信[步骤]:

  1. 服务端程序,需要事先启动,等待客户端的连接
  2. 客户端主动连接服务器端,连接成功才能通信。服务器端不可以主动连接客户端。
    在这里需要注意,服务器必须明确两件事情:
  3. 多个客户端可以同时和服务器进行交互,服务器必须明确和哪个客户端进行的交互----在服务器端有一个方法,叫accept客户端获取到请求的客户端对象。
  4. 多个客户端可以同时和服务器进行交互,就需要使用多个IO流对象-------服务器使用客户端的流和客户端交互。服务器是没有IO流的,服务器可以获取到请求的客户端对象Socket,使用每个客户端Socket中提供的IO流和客户端进行交互。即:服务器使用客户端的字节输入流读取客户端发送的数据,服务器使用客户端的字节输出流给客户端回写数据。

在Java中,提供了两个类用于实现TCP通信程序。

1-- 客户端:java.net.Socket类表示。创建Socket对象,向服务器端发送连接请求,服务器响应请求,两者建立连接开始通信。
2-- 服务端:java.net.ServerSocket类表示。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接。

一、TCP通信客户端的实现

注意:这里的代码实现和服务端实现相对应!!!!!!
/**
 * TCP通信的客户端:向服务器发送请求,给服务器发送数据,读取服务器回写的数据
 * 表示客户端的类:
 *      java.net.Socket:此类实现客户端套接字。套接字是两台机器间通信的端点。
 *      套接字:包含了IP地址和端口号的网络单位
 *
 *      构造方法:
 *          Socket(String host, int port)   创建一个流套接字并将其连接到指定主机上的指定端口。
 *          参数:
 *              String host:服务器主机的名称/服务器的IP地址
 *              int port:服务器的端口号
 *
 *      成员方法:
 *          OutputStream getOutputStream()    返回此套接字的输出流
 *          InputStream getInputStream()    返回此套接字的输入流
 *          void close()    关闭此套接字
 *
 *      实现步骤:
 *      1.创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号
 *      2.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
 *      3.使用网络字节输出流OutputStream对象中的方法write,给服务器发送数据
 *      4.使用Socket对象中的方法getInputStream()获取网络字节输出流InputStream对象
 *      5.使用网络字节输出流InputStream对象中的方法read,读取服务器回写的数据
 *      6.释放资源(Socket)
 *
 *      注意:
 *      1.客户端和服务器端进行交互,必须使用Socket中提供的网络流,不能使用自己创建的对象流
 *      2.当我们创建客户端对象Socket的时候,就会去请求服务器和服务器经过3次握手建立连接通路
 *          这时,如果服务器没有启动,那么就会抛出异常
 *          如果服务器已经启动,那么就可以进行交互了
 */
public class TcpClient {

    public static void main(String[] args) throws IOException {
        //1.创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号
        Socket socket = new Socket("127.0.0.1",8888);
        //2.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
        OutputStream os = socket.getOutputStream();
        //3.使用网络字节输出流OutputStream对象中的方法write,给服务器发送数据
        os.write("你好,服务器!".getBytes());


        //4.使用Socket对象中的方法getInputStream()获取网络字节输出流InputStream对象
         InputStream is = socket.getInputStream();
        //5.使用网络字节输出流InputStream对象中的方法read,读取服务器回写的数据
		byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes,0,len));
        //6。释放资源(Socket)
        socket.close();
    }
}

二、TCP通信服务器端实现

/**
 *  TCP通信的服务器端:接收客户端的请求,读取客户端发送的数据,给客户端回写数据
 *  表示服务器的类:
 *      java.net.ServerSocket: 此类实现服务器套接字
 *
 *  构造方法:
 *      ServerSocket(int port)     创建绑定到特定服务器端口的服务器套接字
 *
 *  服务器端必须明确一件事:必须知道是哪个客户端请求的服务器,所以可以使用accept方法获取到请求的服务端对象Socket
 *
 *  成员方法:
 *      Socket accept()  侦听并接收到此套接字的连接
 *
 *  服务器的实现步骤:
 *      1.创建服务器ServerSocket对象和系统要指定的端口号
 *      2.使用ServerSocket对象中的方法accept,获取到请求的客户端对象Socket
 *      3.使用Socket对象中的方法getInputStream()获取网络字节输出流InputStream对象
 *      4.使用网络字节输出流InputStream对象中的方法read,读取客户端发送的数据
 *      5.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
 *      6.使用网络字节输出流OutputStream对象中的方法write,给客户端回写数据
 *      7.释放资源(Socket,ServerSocket)
 *
 *
 */
public class TcpServer {

    public static void main(String[] args) throws IOException {

        //1.创建服务器ServerSocket对象和系统要指定的端口号
        ServerSocket server = new ServerSocket(8888);
        //2.使用ServerSocket对象中的方法accept,获取到请求的客户端对象Socket
        Socket socket = server.accept();
        //3.使用Socket对象中的方法getInputStream()获取网络字节输出流InputStream对象
        InputStream is = socket.getInputStream();
        //4.使用网络字节输出流InputStream对象中的方法read,读取客户端发送的数据
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes,0,len));
        //5.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
        OutputStream os = socket.getOutputStream();
        //6.使用网络字节输出流OutputStream对象中的方法write,给客户端回写数据
        os.write("收到,谢谢!!".getBytes());
        //7.释放资源(Socket,ServerSocket)
        socket.close();
        server.close();

    }

}
发布了13 篇原创文章 · 获赞 3 · 访问量 702

猜你喜欢

转载自blog.csdn.net/weixin_44270855/article/details/101558209