网络编程

概述

  • 网络编程从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用。
  • 网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理,代码、开发工具、数据库、服务器架设和网页设计这5部分你都要接触。

计算机网络

  • 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件网络及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

网络编程的目的

  • 传递交流信息
  • 数据交换
  • 通信

网络通信的要素

如何实现网络的通信?

  • ip
  • 端口号

规则 网络通信的协议

IP

import java.net.InetAddress;  包名
  • ip地址:InetAddress

    • ​ 唯一定位一台网络上的计算机
    • 127.0.0.1 本机
    • ip地址分类
      • ip地址分类

        • ipv4/ipv6
          • IPV4 127.0.0.1 4个字节组成
          • IPV6 fe80::cc33:b399:f8e0:d7ac%6 128位,8个无符号整数
      • 公网(互联网)-私网(局域网)

        • ABCD类地址
      • 域名:记忆IP问题

端口

  • 端口标识计算机一个程序的进程

    • 不同的进程有不同的端口号

    • 端口被规定为 0~65535

    • TCP,UDB:65535 * 2 ,单个协议端口号不能冲突

    • 端口分类

      • 公有端口 0~1023

        • HTTP:80
        • HTTPS:443
        • FPT:21
        • Telent:23
      • 程序注册端口1024~49151 ,分配用户或程序

        • Tomact:8080
        • Mysql :3306
        • Oracle:1521
      • 动态、私有 49152~65535

        • netstat -ano #查看所有端口
          netstat -ano|findstr "8080" #指定端口
          tasklist|findstr "8696" #查看指定端口的进程
          

通信协议

  • 协议:约定
  • 网络通信协议:速率,传输码率,代码结构,传输控制
  • TCP/IP协议族
    • ps
      • TCP 用户传输协议
      • UDP 用户数据报协议
      • IP:网络互连协议
  • TCP UDP 对比
    • TCP
      • 连接稳定
      • 三次握手,四次挥手
      • 客户端 服务端
      • 传输完成,释放连接,效率低
    • UDP
      • 不连接 不稳定
      • 客户端 服务端,没有明确的界限
      • 不管有没有准备好,都发送
      • DDOS:洪水攻击(饱和攻击)

TCP

  • 客户端

    1. 连接服务器 socket

    2. 发送消息

    3. package com.liu.netLesson01;
      
      import java.io.IOException;
      import java.io.OutputStream;
      import java.net.InetAddress;
      import java.net.Socket;
      import java.net.UnknownHostException;
      
      //客户端
      public class TcpClientDemo01 {
      
          public static void main(String[] args) {
      
              Socket socket = null;
              OutputStream os = null;
      
              //知道服务器的地址
              try {
                  InetAddress serverIp = InetAddress.getByName("127.0.0.1");
                  int port = 9999;
                  socket = new Socket(serverIp, port);
                  os = socket.getOutputStream();
                  os.write("基拔图".getBytes());
      
              } catch (Exception e) {
                  e.printStackTrace();
              } finally {
                  if (os != null) {
                      try {
                          os.close();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
                  if (socket != null) {
                      try {
                          socket.close();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
              }
          }
      }
      
      
  • 服务器端

    1. 建立服务的端口 serverSocket

    2. 等到用户连接accept

    3. 读取用户的消息

    4. package com.liu.netLesson01;
      
      import java.io.ByteArrayOutputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.net.ServerSocket;
      import java.net.Socket;
      
      //服务器端
      public class TcpServerDemo01 {
          public static void main(String[] args) {
              ServerSocket serverSocket = null;
              Socket socket = null;
              InputStream is = null;
              ByteArrayOutputStream baos = null;
      
              //有个地址
              try {
                  serverSocket = new ServerSocket(9999);
      
                  socket = serverSocket.accept();
      
                  is = socket.getInputStream();
      
                  //管道流
                  baos = new ByteArrayOutputStream();
                  byte[] buffer = new byte[1024];
                  int len;
                  while ((len = is.read(buffer)) != -1) {
                      baos.write(buffer, 0, len);
                  }
                  System.out.println(baos.toString());
      
              } catch (IOException e) {
                  e.printStackTrace();
              } finally {
                  if (baos != null) {
                      try {
                          baos.close();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
                  if (is != null) {
                      try {
                          is.close();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
                  if (socket != null) {
                      try {
                          socket.close();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
                  if (serverSocket != null) {
                      try {
                          serverSocket.close();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
              }
          }
      }
      
      

文件上传

服务端

package com.liu.netLesson01;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

//服务器端
public class TcpServerDemo02 {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(9000);
        Socket socket = serverSocket.accept();

        InputStream is = socket.getInputStream();

        FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer)) != -1) {
            fos.write(buffer, 0, len);
        }

        OutputStream os = socket.getOutputStream();
        os.write("success".getBytes());


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

客服端

package com.liu.netLesson01;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

public class TcpClientDemo02 {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
        OutputStream os = socket.getOutputStream();

        FileInputStream fis = new FileInputStream(new File("C:\\Users\\86134\\Pictures\\Camera Roll\\xinhen\\1.jpg"));

        byte[] buffer = new byte[1024];
        int len;
        while ((len = fis.read(buffer)) != -1) {
            os.write(buffer, 0, len);
        }
        socket.shutdownOutput();


        InputStream is = socket.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] bytes = new byte[1024];
        int len2;
        while ((len2 = is.read(bytes)) != -1) {
            baos.write(bytes, 0, len2);
        }

        System.out.println(baos.toString());

        baos.close();
        is.close();
        fis.close();
        os.close();
        socket.close();
    }
}

UDP

  • 接收端

  • package com.liu.netLesson02;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class UdpServerDemo01 {
        public static void main(String[] args) throws Exception {
            DatagramSocket socket = new DatagramSocket(9090);
    
            byte[] bytes = new byte[1024];
    
            DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length);
    
            socket.receive(packet);
    
            System.out.println(packet.getAddress().getHostAddress());
            System.out.println(new String(packet.getData(),0,packet.getLength()));
    
            socket.close();
        }
    }
    
  • 发送端

package com.liu.netLesson02;

import java.io.IOException;
import java.net.*;

public class UdpClientDemo01 {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket();

        String msg = "哈哈哈哈哈哈哈哈";
        InetAddress localhost = InetAddress.getByName("localhost");
        int port = 9090;

        DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);


        socket.send(packet);

        socket.close();

    }
}

咨询

  • 接收端

  • package com.liu.Chatr;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class UdpReceiveDemo01 {
        public static void main(String[] args) throws Exception {
            DatagramSocket socket = new DatagramSocket(6666);
    
            byte[] container = new byte[1024];
    
            while (true) {
                DatagramPacket packet = new DatagramPacket(container, 0, container.length);
                socket.receive(packet);
    
                byte[] data = packet.getData();
                String datas = new String(data, 0, data.length);
                System.out.println(datas);
    
                if (datas.equals("bye")) {
                    break;
                }
            }
            socket.close();
        }
    }
    
    
  • 发送端

  • package com.liu.Chatr;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetSocketAddress;
    
    public class UdpSenderDemo01 {
        public static void main(String[] args) throws Exception {
            DatagramSocket socket = new DatagramSocket(8888);
    
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    
            while (true) {
                String data = reader.readLine();
                byte[] datas = data.getBytes();
    
                DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress("localhost", 6666));
    
                socket.send(packet);
                if (data.equals("bye")) {
                    break;
                }
            }
            socket.close();
        }
    }
    
    
posted @ 2020-12-31 17:29  流年りゅう  阅读(125)  评论(0)    收藏  举报