• java的网络编程


    网络编程

    网络编程:java语言支持网络间的数据传输,将底层的细节封装起来了,给程序员提供了一套标准类库,方便java开发出可以进行网络通信的软件

    核心问题:如何找到网络世界中的目标主机,和目标软件:找ip地址

    如何安全可靠的进行数据传输

    基本知识:

    网络模型:
    OSI参考模型:理想化的标准模型,有七层
    实际使用的TCP/IP模型:
    • 应用层:各种协议规则,软件部分

    • 运输层:协议检测

    • 网络层:找ip

    • 物理链路层:硬件设备(网卡…)

    通信要素:ip,端口,协议
    IP:在网络世界中,表示计算机的地址
    • 局域网地址:连接路由器,由路由器自动分配ip

    • 广域网地址:家里的宽带,与外界连接

    • 本机地址:本地回环地址

    端口:是计算机中运行中的程序的编号

    0~1024是留给系统程序的

    1024~65535是为开发的程序使用,是我们为程序定义端口号时使用的

    端口不能重复,不能与已有的端口冲突

    如何安全传输——通信协议:

    对传输的内容,速率,出错之后的处理办法等进行的控制与制约

    传输层有两个主要协议:

    • 传输控制协议TCP(Transmission Control Protocol)

      使用TCP前必须先要检测网络是否畅通,服务器是否能连接到网络

      即三次握手:第一次客户端给服务器发确保服务器能收到,第二次服务器收到给客户端发,此时客户端知道服务器能收到,然后第三次客户端再给服务器发,此时服务器也知道了自己的消息能被客户端收到

      断开流程:

      四次挥手:第一次客户端告诉服务器要断开了,第二次服务器给客户端反馈,第三次服务器把没有发完的数据给客户端,第四次客户端再通知服务器最终断开

    • 用户数据报协议UDP(User Datagram Protocol)

      将数据封装成一个一个数据报

      每个数据报的大小限制在64K内

      数据报中包含数据,源(自己电脑ip)目标(接收端ip 端口)

      发送前不需要建立连接,只管发送不管成功与否

      不够安全,但是效率高

      例如根据坐标发射导弹

      服务器与客户端:

      Socket(InetAddress address,int port)throws IOException
      //根据InetAddress对象所表示的IP地址以及端口号port发起连接。
      Socket(String host,int port)
      //域名是host。端口号为port)发起TCP连接,若成功,则创建Socket对象,否则抛出异常。
      Socket accept() throws IOException
      //等待客户端的连接请求,返回与该客户端进行通信用的Socket对象
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      客户端:

      //创建客户端
          try {
              	//host是域名,port是端口
              	Socket socket=newSocket("192.168.124.185",7777);
                  //在客户端向服务器发送一段话
                  OutputStream o=socket.getOutputStream();
                  String s="哈哈哈";
                  o.write(s.getBytes());
              } catch (IOException e) {
              e.printStackTrace();
              System.out.println("连接服务器失败");
          }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12

      服务器:

      try {
                  //创建并启动服务器
                  ServerSocket so=new ServerSocket(7777);
                  System.out.println("服务器启动成功");
          		//监听有没有客户端连接到服务器,监听时会阻塞程序
                  Socket socket=so.accept();
                  System.out.println("有客户端连接到了服务器");
                  //接收客户端发送的数据
                  InputStream in= socket.getInputStream();
                  byte[] bytes=new byte[100];
                  int size=in.read(bytes);
                  String s=new String(bytes,0,size);
                  System.out.println(s);
              } catch (IOException e) {
                  e.printStackTrace();
                  System.out.println("服务器启动失败");
              }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17

    用Data在客户端和服务器之间输入输出数据:

    客户端:

    //创建客户端
            try {
                Socket socket=new Socket("192.168.124.185",7777);//host是域名,port是端口
                //在客户端向服务器发送一段话
                OutputStream outputStream= socket.getOutputStream();
                DataOutputStream dataOutputStream=new DataOutputStream(outputStream);//数据处理流,直接可以输出字符串
                Scanner scanner=new Scanner(System.in);
                System.out.println("客户端输入:");
                String s=scanner.next();
                dataOutputStream.writeUTF(s);
                //接收服务器发的消息
                InputStream inputStream= socket.getInputStream();
                DataInputStream dataInputStream=new DataInputStream(inputStream);
                String s1=dataInputStream.readUTF();
                System.out.println("服务器说:"+s1);
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("连接服务器失败");
            }
    /*
    客户端输入:
    xswl
    服务器说:byd
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    服务器:

    try {
                //创建并启动服务器
                ServerSocket so=new ServerSocket(7777);
                System.out.println("服务器启动成功");
                Socket socket=so.accept();//监听有没有客户端连接到服务器,监听时会阻塞程序
                System.out.println("有客户端连接到了服务器");
                //接收客户端发送的数据
                InputStream inputStream= socket.getInputStream();
                DataInputStream dataInputStream=new DataInputStream(inputStream);
                String s=dataInputStream.readUTF();
                System.out.println("客户端说:"+s);
                //服务器回复消息
                OutputStream outputStream = socket.getOutputStream();
                DataOutputStream dataOutputStream=new DataOutputStream(outputStream);
                Scanner scanner=new Scanner(System.in);
                System.out.println("服务器输入:");
                String s1=scanner.next();
                dataOutputStream.writeUTF(s1);
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("服务器启动失败");
            }
    /*
    服务器启动成功
    有客户端连接到了服务器
    客户端说:xswl
    服务器输入:
    byd
    */
    
    • 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
  • 相关阅读:
    Python大数据之PySpark(二)PySpark安装
    Docker基础命令操作
    02_Alibaba微服务组件Nacos注册中心
    排序算法:快速排序
    单片机论文参考:5、基于单片机的自动打铃系统
    记录k8s-Calico网络插件报错问题
    力扣-240.搜索二维矩阵(2)
    Docker仓库
    【Python】数据类型 + 运算符 + 输入输出
    Go语言实现数据结构栈和队列
  • 原文地址:https://blog.csdn.net/qq_45576281/article/details/133975417