• 什么是网络编程(一)


    1.什么是网络、计算机网络的构成是什么?

    在计算领域中,网络是传输信息、接受、共享的虚拟的平台。

    通过它可以把各个点、面、体的信息联系到一起,从而实现这些资源的共享。

    网络是人类发展史上最重要的发明,提高了人类和科技的一个发展。

    2.什么是网络编程?

    网络编程从大的方面就是说对信息的发送接收。

    通过操作相应API调度计算机资源硬件,并且利用管道(网线)进行数据交互的过程。

    更为具体的涉及:网络模型、套接字、数据包

    3. 7层网络模型–OSI

    基础层:物理层(physical)、数据链路层(Datalink)、网络层(network).。

    传输层(Transport):TCP-UDP协议层、Socket。

    高级层::会话层(Session)、表示层(Presentation)、应用层(Application)

    4. 网络模型—对应关系

    5.Socket与TCP、UDP

    Socket: 简单来说是ip地址与端口的结合协议(RFC 793).

    一种地址与端口的结合描述协议。

    TCP/IP协议的相关API的总称;是网络API的集合实现.

    涵盖了Stream socket /Datagram Socket

    socket 的组成与作用:

    在网络传输中用于唯一标识两个端点的链接。

    端点:包括(ip+port)

    4个要素:客户端的地址、客户端的端口、服务器的地址、服务器端口。

    6. Socket的传输原理

    Socket之TCP:

    tcp是面向连接的通讯协议。

    通过三次握手建立连接,通讯完成时要拆除连接。

    由于TCP是面向连接的,所以只能用于端到端的通信。

    Socket之UDP:

    UDP是面向无连接进行通讯的。

    UDP数据包括目的端口号和源端口号信息。

    由于通讯时是不需要连接,所以可以是实现广播发送,并不局限于端到端。

    TCP传输图解:

    UDP传输图解:

    7.Client-Server Application

    TCP/IP协议中,两个进程间通信的主要模式为CS模型

    主要的目的:协调网络中计算机资源、服务模式、进程间数据共享

    常见的FTP、SMTP、HTTP

    8.报文段

    报文段是指TCP/IP协议网络传输过程中,起着路由导航作用。

    可以查询各个网络路由网段、IP地址、交换协议等ip数据包。

    报文段充当整个TCP/IP协议数据包的导航路由功能。

    报文在传输过程中会不断的封装成分组、包、帧来传输。

    封装的方式就是添加一些控制信息组成的首部,即报文头。

    9.传输协议

    一种约定,约束

    约定大于配置,在网络传输中依然食用;网络的传输是健壮的稳定的,得益于基础的协议构成。

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @Author: itwang @Description: @Date: Created in 22:40 2018/12/29 @Package: PACKAGE_NAME @Modified
     * By:
     */
    public class Server {
    
      public static void main(String[] args) throws Exception {
    
        ServerSocket serverSocket = new ServerSocket(2000);
        System.out.println("服务器准备就绪----");
        System.out.println(
            "服务器信息:" + serverSocket.getInetAddress() + "p:" + serverSocket.getLocalPort());
        for (; ; ) {
          // 等待客户端连接
          Socket client = serverSocket.accept();
          // 客户端构建异步线程
          ClientHandler clientHandler = new ClientHandler(client);
          // 启动线程
          clientHandler.start();
        }
    
        // todo(client);
      }
    
      /** 客户端消息处理 */
      private static class ClientHandler extends Thread {
    
        private Socket socket;
        private boolean flag = true;
    
        ClientHandler(Socket socket) {
    
          this.socket = socket;
        }
    
        /**
         * If this thread was constructed using a separate Runnable run object, then that
         * Runnable object's run method is called; otherwise, this method does
         * nothing and returns.
         *
         * 

    Subclasses of Thread should override this method. * * @see #start() * @see #stop() * @see #(ThreadGroup, Runnable, String) */ @Override public void run() { super.run(); System.out.println("客户端连接:" + socket.getInetAddress() + "p:" + socket.getPort()); try { // 得到打印流,用于服务器输出;服务端回送数据 PrintStream socketOutPut = new PrintStream(socket.getOutputStream()); // 得到输入流 BufferedReader socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream())); do { // 从客户端拿到一条数据 String str = socketInput.readLine(); if ("bye".equalsIgnoreCase(str)) { flag = false; // 回送 socketOutPut.println("bye"); } else { // 打印到屏幕并回送数据长度 System.out.println(str); socketOutPut.println("回送:" + str.length()); } } while (flag); socketInput.close(); socketOutPut.close(); } catch (Exception e) { System.out.println("连接异常断开"); } finally { // 连接关闭 try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } System.out.println("客户端关闭" + socket.getInetAddress() + "p" + socket.getPort()); } } } ; import java.io.*; import java.net.Inet4Address; import java.net.InetSocketAddress; import java.net.Socket; /** * @author : itwang * @description: * @date: Created in 22:40 2018/12/29 * @package: PACKAGE_NAME * @modified By: */ public class Client { public static void main(String[] args) throws IOException { // 创建socket Socket socket = new Socket(); // 设置超时时间 socket.setSoTimeout(3000); socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(), 2000)); System.out.println("已经发起服务器连接,并进入后续流程"); System.out.println("客户端信息:" + socket.getLocalAddress() + "p:" + socket.getLocalPort()); System.out.println("服务端信息:" + socket.getInetAddress() + "P" + socket.getPort()); try { todo(socket); } catch (Exception e) { System.out.println("异常关闭"); } // 释放资源 socket.close(); System.out.println("客户端退出"); } private static void todo(Socket client) throws IOException { // 构建键盘输入流 InputStream in = System.in; BufferedReader input = new BufferedReader(new InputStreamReader(in)); // 得到socket输出流,并且转化为打印流 OutputStream outputStream = client.getOutputStream(); PrintStream socketPrintStream = new PrintStream(outputStream); // 得到socket输入流,并转化为bufferedReader InputStream inputStream = client.getInputStream(); BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(inputStream)); boolean flag = true; do { // 键盘读取一行 String str = input.readLine(); // 发送到服务器 socketPrintStream.println(str); // 从服务器读取一行 String echo = socketBufferedReader.readLine(); if ("bye".equalsIgnoreCase(echo)) { flag = false; } else { System.out.println(echo); } } while (flag); // 资源释放 socketPrintStream.close(); socketBufferedReader.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
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
  • 相关阅读:
    数据库如何储存和管理数据的?
    【Python】爬虫基础
    使用系统识别应用程序识别低阶传递函数(过程模型)
    element ui中的el-tree自定义每个节点,前面加不同颜色的块
    Postgresql源码(113)表达式JIT计算简单分析
    要素类WKT文本获取
    [机器视觉]halcon应用实例 边缘检测2
    GB28181学习(三)——心跳保活
    PyQt theme
    络达开发---自定义Timer的实现
  • 原文地址:https://blog.csdn.net/bsegebr/article/details/126553575