Java 基础入门 | 第十六章 Java网络编程

简介: 目录网络相关概念网络协议网络编程TCP编程UDP编程URL编程网络相关概念什么是计算机网络局域网 城域网 广域网把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使

 网络相关概念

什么是计算机网络

    • 局域网
    • 城域网
    • 广域网

    把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源

    计算机网络的主要功能

      • 资源共享
      • 信息传输与集中处理
      • 均衡负荷与分布处理
      • 综合信息服务 (www/综合业务数字网络 ISDN)

      image.gif编辑

      IP地址:用于唯一识别连接到Internet上的计算机

      地址表示方式

      IPv4: 点分10进制表示方式,四个整数用点分开,每个十进制数字代表一个8 bits整数,如192.168.123.1

      IPv6: 点分16进制表示方式,八个整数用点分开,每个十六进制数字代表一个16bits整数,如CDCD:910A:2222:5498:8475:1111:3900:2020

      域名  如www.sina.com.cn     DNS

      分布式的应用程序  

      192.168.1.121   192.168.1.122  123    

      本地IP

      127.0.0.1   等同于    localhost

      端口号

      0-65535之间

      网络协议

      网络模型与协议

      image.gif编辑什么是网络通信协议

      计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传 输控制步骤、出错控制等制定标准。

      TCP协议是一个面向连接的、可靠的协议

      TCP(transmission control protocol)

      是专门设计用于在不可靠的因特网上提供可靠的、端到端的字节流通信的协议。它是一种面向连接的协议。TCP连接是字节流而非报文流。

      UDP协议是一个不可靠的、无连接协议

      UDP(user datagram protocol )

      UDP向应用程序提供了一种发送封装的原始IP数据报的方法、并且发送时无需建立连接。是一种不可靠的连接。

      网络编程

      TCP编程

      TCP编程的核心类

      java.net.Socket

      java.net.ServerSocket

      TCP编程的核心思路

      开发服务器端

      ServerSocket ss = new ServerSocket(9000)
      ss.accept();

      image.gif

      开发客户端

      Socket s = new Socket("150.236.56.101", 9000)

      image.gif

      图示

      image.gif编辑

      服务器端:

        • 创建ServerSocket对象(并绑定端口)
        • 调用accept方法,等待来自客户端的连接
        • 调用getXXXStream方法,进行I/O
        • 关闭Socket

        客户端:

          • 创建Socket对象,并连接服务器
          • 调用getXXXStream方法,进行I/O
          • 关闭Socket

          编写程序,实现客户端发送HelloWorld到服务器端的功能。

          服务端程序编写

          import java.io.BufferedReader;
          import java.io.IOException;
          import java.io.InputStream;
          import java.io.InputStreamReader;
          import java.net.ServerSocket;
          import java.net.Socket;
          public class HttpSocketServer {
              public static void main(String[] args) {
                  try {
                      ServerSocket server=new ServerSocket(9010);
                      Socket socket=server.accept();
                      InputStream is=socket.getInputStream();
                      BufferedReader reader=new BufferedReader(new InputStreamReader(is));
                      String text=reader.readLine();
                      System.out.println(text);
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }

          image.gif

          客户端程序编写

          import java.io.IOException;
          import java.io.OutputStream;
          import java.io.PrintWriter;
          import java.net.Socket;
          public class HttpSocketClient {
              public static void main(String[] args) {
                  try {
                      Socket client=new Socket("127.0.0.1",9010);
                      OutputStream out=client.getOutputStream();
                      PrintWriter writer=new PrintWriter(out);
                      writer.print("哈喽,我是洛阳泰山");
                      writer.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }

          image.gif

          注意:先启动服务端程序,后启动客户端程序 !

          编写程序,客户端向服务器端发送”How are you?Server”,服务器端向客户端发送”I am fine ! Thank you,client!”

          服务端代码

          import java.io.*;
          import java.net.ServerSocket;
          import java.net.Socket;
          public class HttpSocketServer1 {
              public static void main(String[] args) {
                  try {
                      ServerSocket server=new ServerSocket(9020);
                      Socket socket=server.accept();
                      InputStream is=socket.getInputStream();
                      BufferedReader reader=new BufferedReader(new InputStreamReader(is));
                      String text=reader.readLine();
                      System.out.println("来自客户端的消息:"+text);
                      OutputStream out=socket.getOutputStream();
                      PrintWriter writer=new PrintWriter(out);
                      writer.print("I am fine ! Thank you,client!\n");
                      writer.flush();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }

          image.gif

          客户端代码

          import java.io.*;
          import java.net.Socket;
          public class HttpSocketClient1 {
              public static void main(String[] args) {
                  try {
                      Socket client=new Socket("127.0.0.1",9020);
                      OutputStream out=client.getOutputStream();
                      PrintWriter writer=new PrintWriter(out);
                      writer.print("How are you?Server\n");
                      writer.flush();
                      InputStream is=client.getInputStream();
                      BufferedReader reader=new BufferedReader(new InputStreamReader(is));
                      String text=reader.readLine();
                      System.out.println("来自服务端的消息:"+text);
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }

          image.gif

          UDP编程

          UDP协议简介

          UDP是一个无连接,不可靠的协议。即:数据的发送方只负责将数据发送出去,数据的接受方只负责接受数据。发送方和接收方不会相互确认数据的传输是否成功。

          UDP编程

            • java.net.DatagramSocket
            • java.net.DatagramPacket   数据包

            UDP编程的核心思路

              • 服务器 DatagramSocket socket = new DatagramSocket(9000)
              • 客户端 DatagramSocket socket = new DatagramSocket()

              DatagramPacket

                • DatagramPacket(byte[] buf, int,length)
                • DatagramPacket(byte[] buf, int ,length, SoketAddress)
                • getAddress()/getSockAddress()/getPort()/getLength()
                • setAddress()/setSockAddress()/setPort()/setLength()

                使用UDP协议发送接收消息

                服务端程序编写

                import java.io.IOException;
                import java.net.DatagramPacket;
                import java.net.DatagramSocket;
                import java.net.SocketException;
                public class UDPServer {
                    public static void main(String[] args) {
                        try {
                            DatagramSocket socket=new DatagramSocket(9000);
                            byte[] buf=new byte[1024];
                            DatagramPacket packet=new DatagramPacket(buf,0,buf.length);
                            socket.receive(packet);
                            String text=new String(buf,0,packet.getLength());
                            System.out.println(text);
                            socket.close();
                        } catch (SocketException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }

                image.gif

                客户端程序编写

                import java.io.IOException;
                import java.net.*;
                import java.nio.charset.StandardCharsets;
                public class UDPClient {
                    public static void main(String[] args) {
                        try {
                            DatagramSocket socket=new DatagramSocket();
                            String text="哈喽,我是洛阳泰山!";
                            byte[] data=text.getBytes(StandardCharsets.UTF_8);
                            SocketAddress address=new InetSocketAddress("127.0.0.1",9000);
                            DatagramPacket packet=new DatagramPacket(data,0,data.length,address);
                            socket.send(packet);
                        } catch (SocketException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }

                image.gif

                使用UDP协议互发互收消息

                服务端程序编写

                import java.io.IOException;
                import java.net.*;
                import java.nio.charset.StandardCharsets;
                public class UDPServer {
                    public static void main(String[] args) {
                        try {
                            DatagramSocket socket=new DatagramSocket(9000);
                            byte[] buf=new byte[1024];
                            DatagramPacket paper=new DatagramPacket(buf,0,buf.length);
                            socket.receive(paper);
                            String text=new String(buf,0,paper.getLength());
                            System.out.println(text);
                            String massage="哈喽,我是服务端消息!";
                            byte[] data=massage.getBytes(StandardCharsets.UTF_8);
                            DatagramPacket packet=new DatagramPacket(data,0,data.length,paper.getSocketAddress());
                            socket.send(packet);
                            socket.close();
                        } catch (SocketException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }

                image.gif

                客户端程序编写

                import java.io.IOException;
                import java.net.*;
                import java.nio.charset.StandardCharsets;
                public class UDPServer {
                    public static void main(String[] args) {
                        try {
                            DatagramSocket socket=new DatagramSocket(9000);
                            byte[] buf=new byte[1024];
                            DatagramPacket paper=new DatagramPacket(buf,0,buf.length);
                            socket.receive(paper);
                            String text=new String(buf,0,paper.getLength());
                            System.out.println(text);
                            String massage="哈喽,我是服务端消息!";
                            byte[] data=massage.getBytes(StandardCharsets.UTF_8);
                            DatagramPacket packet=new DatagramPacket(data,0,data.length,paper.getSocketAddress());
                            socket.send(packet);
                            socket.close();
                        } catch (SocketException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }

                image.gif

                URL编程

                URL概念

                统一资源定位符

                URL组成

                  URL编程

                    • URL
                    • URLConnection

                    URL编程思路

                      • 创建URL对象
                      • 调用URL对象的openConnection方法,获得URLConnection
                      • 调用URLConnection方法的getInputStream,获得输入流,从而读取资源
                      • I/O操作
                      • 关闭I/O流

                      代码示例

                      import java.io.BufferedReader;
                      import java.io.IOException;
                      import java.io.InputStream;
                      import java.io.InputStreamReader;
                      import java.net.MalformedURLException;
                      import java.net.URL;
                      import java.net.URLConnection;
                      public class TestURL {
                          public static void main(String[] args) {
                              try {
                                  //创建URL对象
                                  URL url=new URL("https://www.baidu.com/");
                                  //调用URL的openConnection方法获取URLConnection连接对象
                                  URLConnection connection= url.openConnection();
                                  //调用URLConnection的getInputStream方法获取输入流
                                  InputStream is=connection.getInputStream();
                                  //读取流的文本信息
                                  BufferedReader reader=new BufferedReader(new InputStreamReader(is));
                                  String line=null;
                                  while((line=reader.readLine())!=null){
                                      System.out.println(line);
                                  }
                                  reader.close();
                              } catch (MalformedURLException e) {
                                  e.printStackTrace();
                              } catch (IOException e) {
                                  e.printStackTrace();
                              }
                          }
                      }

                      image.gif


                      相关文章
                      |
                      19天前
                      |
                      监控 安全 数据安全/隐私保护
                      智能家居安全入门:保护你的网络家园
                      本文旨在为初学者提供一份简明扼要的指南,介绍如何保护自己的智能家居设备免受网络攻击。通过分析智能家居系统常见的安全漏洞,并提供实用的防御策略,帮助读者建立起一道坚固的数字防线。
                      |
                      6天前
                      |
                      设计模式 Java 关系型数据库
                      【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
                      本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
                      |
                      6天前
                      |
                      安全 Java API
                      【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
                      String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
                      【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
                      |
                      6天前
                      |
                      缓存 安全 Java
                      【Java面试题汇总】Java基础篇——基础、修饰符和关键字(2023版)
                      Java的特点和优点,、Java 8的新特性、面向对象、基本数据类型和引用类型、自动拆装箱与自动装箱、==与equals()的区别、为什么重写equals()就要重写hashcode()、抽象类和接口的区别、重载和重写的区别、四种引用方式、wt()和sleep()的区别、java方法是值传递还是引用传递?访问修饰符、static、final、this和super、volatile的用法及原理
                      【Java面试题汇总】Java基础篇——基础、修饰符和关键字(2023版)
                      |
                      6天前
                      |
                      机器学习/深度学习 人工智能 TensorFlow
                      深度学习入门:理解卷积神经网络(CNN)
                      【9月更文挑战第14天】本文旨在为初学者提供一个关于卷积神经网络(CNN)的直观理解,通过简单的语言和比喻来揭示这一深度学习模型如何识别图像。我们将一起探索CNN的基本组成,包括卷积层、激活函数、池化层和全连接层,并了解它们如何协同工作以实现图像分类任务。文章末尾将给出一个简单的代码示例,帮助读者更好地理解CNN的工作原理。
                      23 7
                      |
                      20天前
                      |
                      图形学 C#
                      超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
                      【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
                      62 6
                      |
                      8天前
                      |
                      Java 程序员
                      Java中的异常处理:从入门到精通
                      在Java编程的世界中,异常处理是保持程序稳定性和可靠性的关键。本文将通过一个独特的视角—把异常处理比作一场“捉迷藏”游戏—来探讨如何在Java中有效管理异常。我们将一起学习如何识别、捕捉以及处理可能出现的异常,确保你的程序即使在面对不可预见的错误时也能优雅地运行。准备好了吗?让我们开始这场寻找并解决Java异常的冒险吧!
                      |
                      10天前
                      |
                      机器学习/深度学习 人工智能 TensorFlow
                      神经网络入门到精通:Python带你搭建AI思维,解锁机器学习的无限可能
                      【9月更文挑战第10天】神经网络是开启人工智能大门的钥匙,不仅是一种技术,更是模仿人脑思考的奇迹。本文从基础概念入手,通过Python和TensorFlow搭建手写数字识别的神经网络,逐步解析数据加载、模型定义、训练及评估的全过程。随着学习深入,我们将探索深度神经网络、卷积神经网络等高级话题,并掌握优化模型性能的方法。通过不断实践,你将能构建自己的AI系统,解锁机器学习的无限潜能。
                      11 0
                      |
                      20天前
                      |
                      网络协议 C# 开发者
                      WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
                      【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
                      42 0
                      |
                      20天前
                      |
                      机器学习/深度学习 人工智能 自然语言处理
                      深度学习中的卷积神经网络(CNN)入门
                      【8月更文挑战第31天】在人工智能的浪潮中,深度学习以其强大的数据处理能力成为时代的宠儿。本文将引导你走进深度学习的核心组件之一——卷积神经网络(CNN),并带你一探其背后的奥秘。通过简明的语言和直观的代码示例,我们将一起构建一个简易的CNN模型,理解它在图像处理领域的应用,并探索如何利用Python和TensorFlow实现它。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇通往深度学习世界的大门。