网络编程初步学习

  1. 1. 第一章 网络编程入门
    1. 1.0.0.1. 1.1 软件结构
    2. 1.0.0.2. 1.2网络通信协议
    3. 1.0.0.3. 1.3协议分类:
    4. 1.0.0.4. 1.4网络编程三要素
  • 2. 第二章:TCP通信程序
    1. 2.0.0.1. 2.1概述
    2. 2.0.0.2. 2.2 Socket类

  • 第一章 网络编程入门

    1.1 软件结构

    • C/S结构:客户端和服务器结构,常见的有:QQ、迅雷等软件
    • B/S结构:浏览器和服务器结构,常见的有:谷歌、火狐等

    1.2网络通信协议

    • 网络通信协议
    • TCP/IP协议:传输控制协议/因特网互联协议。四层模型(应用层、传输层<TCP、UDP>、网络层、数据链路层和物理层)

    1.3协议分类:

    • UDP:用户数据报协议。面向无连接的通信协议,当一台计算机向另一台计算机发送数据时,发送端不会确认接收端是否存在,就会发送数据,同样接收端在收到数据时,也不会向发送端反馈是否接收到数据。
    • *优点**:消耗资源小,通信效率高,通常用于音频、视频和普通数据的传输。
    • *缺点**:不能保证数据的完整性,偶尔会丢失少量数据包。
      <UDP相对于TCP而言,是缺少一个可靠的丢失重发机制,因此可以立即返回,所以你觉得快>
    • TCP:传输控制协议。面向连接的通信协议,传输数据前,先建立逻辑连接,再传输数据,提供了两台计算机间可靠的无差错的数据传输。
      在TCP连接中必须要明确客户端与服务器,由客户端发送连接请求,每次连接的创建都要经过“三次握手”。保证数据传输安全。
    • 三次握手
      1、第一次握手:客户端向服务器发送连接请求,等待服务器确认。
      2、第二次握手:服务器向客户端回送一个响应。通知客户端收到了连接请求。
      3、第三次握手:客户端再次向服务器发送确认信息,确认连接。

    1.4网络编程三要素

    ①协议
    ②IP地址

    • ipv4 32位的二进制数,通常被分为四个字节,可以表示2^32≈42亿个
    • ipv6 128位的十六进制数,每16个字节一组,分成8组,可以表示16^128个
      特殊的IP地址:127.0.0.1、localhost <代表的都是本地的IP地址>

    ③端口号

    • 是一个逻辑端口,无法直接看到。由两个字节组成,取值范围在0-65535之间
    • *注意**:
      1、1024之前的端口号已经不能使用了,被系统分配到已知的网络软件了
      2、端口号不能重复
    • 使用IP+端口号就能保证数据准确无误地发送到对方计算机的指定软件上了
      常见的端口号:
      1、80端口 网络端口 如:www.baidu.com:80
      2、数据库 mysql:3306 oracle:1521
      3、Tomcat服务器:8080

    第二章:TCP通信程序

    2.1概述

    两端通信步骤:
    1、服务端程序,需要事先启动,等待客户端的连接
    2、客户端主动连接服务器端,连接成功才能实现通信。服务端不可以主动连接客户端。

    在Java中,提供了两个类来实现TCP通信程序
    1、客户端:java.net.Socket类表示,创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。
    2、服务端:java.net.ServerSocket 类表示。创建 ServerSocket 对象,相当于开启一个服务,并等待客户端 的连接。

    2.2 Socket类

    Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。 构造方法:public Socket(String host, int port) :创建套接字对象并将其连接到指定主机上的指定端口号。如果指 定的host是null ,则相当于指定地址为回送地址。
    例如:

    1
    Socket client = new Socket("127.0.0.1", 6666);

    成员方法包括:getInputStream、getOutputStream、close、shutdownOutput.

    具体实现:
    客户端类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    package com.silencoco._NET;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;

    public class TCPClient {
    public static void main(String[] args) throws IOException {
    /**
    * 设置IP、端口号
    * 使用socket中的getOutputStream方法获取os对象
    * 使用outputStream中的write给服务器发送数据
    *
    * getInputStream获取,read读取
    * 释放资源
    */
    Socket socket = new Socket("127.0.0.1",8888);
    // socket.getOutputStream().write(Integer.parseInt("向服务器发送数据..."));
    OutputStream os = socket.getOutputStream();
    os.write("客户端发出请求".getBytes());
    InputStream is = socket.getInputStream();
    byte[] bytes = new byte[1024];
    int len = is.read(bytes);
    System.out.printf(new String(bytes,0,len));

    socket.close();
    }
    }

    服务器类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    package com.silencoco._NET;

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;

    /**
    * 创建ServerSocket对象,指定端口号,
    * 使用ServerSocket对象中的accept获取到请求的客户端对象Socket
    * 使用socket对象中国年的getInputStream获取输入流
    * read读取
    * 在用socket.getOutputStream write 回写数据
    * close
    */
    public class TCPServer {
    public static void main(String[] args) throws IOException {
    ServerSocket serverSocket = new ServerSocket(8888);
    Socket socket = serverSocket.accept();
    InputStream is = socket.getInputStream();
    byte[] bytes = new byte[1024];
    int len = is.read(bytes);
    System.out.printf(new String(bytes,0,len));
    OutputStream os = socket.getOutputStream();
    os.write("服务器收到请求并响应".getBytes());

    serverSocket.close();
    socket.close();
    }
    }