三十八、java版 SpringCloud分布式微服务云架构之Java 网络编程

2023-11-18

 Java 网络编程

网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。

java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。

java.net 包中提供了两种常见的网络协议的支持:

  • TCP:TCP(英语:Transmission Control Protocol,传输控制协议) 是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP 层是位于 IP 层之上,应用层之下的中间层。TCP 保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。

  • UDP:UDP (英语:User Datagram Protocol,用户数据报协议),位于 OSI 模型的传输层。一个无连接的协议。提供了应用程序之间要发送数据的数据报。由于UDP缺乏可靠性且属于无连接协议,所以应用程序通常必须容许一些丢失、错误或重复的数据包。

本教程主要讲解以下两个主题。

  • Socket 编程:这是使用最广泛的网络概念,它已被解释地非常详细。

  • URL 处理:这部分会在另外的篇幅里讲。
     


Socket 编程

套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。

当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。

java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。

以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:

  • 服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。

  • 服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。

  • 服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。

  • Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。

  • 在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。

连接建立后,通过使用 I/O 流在进行通信,每一个socket都有一个输出流和一个输入流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。

TCP 是一个双向的通信协议,因此数据可以通过两个数据流在同一时间发送.以下是一些类提供的一套完整的有用的方法来实现 socket。


ServerSocket 类的方法

服务器应用程序通过使用 java.net.ServerSocket 类以获取一个端口,并且侦听客户端请求。

ServerSocket 类有四个构造方法:

 创建非绑定服务器套接字。 如果 ServerSocket 构造方法没有抛出异常,就意味着你的应用程序已经成功绑定到指定的端口,并且侦听客户端请求。

这里有一些 ServerSocket 类的常用方法:


Socket 类的方法

java.net.Socket 类代表客户端和服务器都用来互相沟通的套接字。客户端要获取一个 Socket 对象通过实例化 ,而 服务器获得一个 Socket 对象则通过 accept() 方法的返回值。

Socket 类有五个构造方法.

 当 Socket 构造方法返回,并没有简单的实例化了一个 Socket 对象,它实际上会尝试连接到指定的服务器和端口。

下面列出了一些感兴趣的方法,注意客户端和服务器端都有一个 Socket 对象,所以无论客户端还是服务端都能够调用这些方法。


InetAddress 类的方法

这个类表示互联网协议(IP)地址。下面列出了 Socket 编程时比较有用的方法:


Socket 客户端实例

如下的 GreetingClient 是一个客户端程序,该程序通过 socket 连接到服务器并发送一个请求,然后等待一个响应。

GreetingClient.java 文件代码:

// 文件名 GreetingClient.java
 
import java.net.*;
import java.io.*;
 
public class GreetingClient
{
   public static void main(String [] args)
   {
      String serverName = args[0];
      int port = Integer.parseInt(args[1]);
      try
      {
         System.out.println("连接到主机:" + serverName + " ,端口号:" + port);
         Socket client = new Socket(serverName, port);
         System.out.println("远程主机地址:" + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out = new DataOutputStream(outToServer);
 
         out.writeUTF("Hello from " + client.getLocalSocketAddress());
         InputStream inFromServer = client.getInputStream();
         DataInputStream in = new DataInputStream(inFromServer);
         System.out.println("服务器响应: " + in.readUTF());
         client.close();
      }catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}

Socket 服务端实例

如下的GreetingServer 程序是一个服务器端应用程序,使用 Socket 来监听一个指定的端口。

GreetingServer.java 文件代码:

// 文件名 GreetingServer.java
 
import java.net.*;
import java.io.*;
 
public class GreetingServer extends Thread
{
   private ServerSocket serverSocket;
   
   public GreetingServer(int port) throws IOException
   {
      serverSocket = new ServerSocket(port);
      serverSocket.setSoTimeout(10000);
   }
 
   public void run()
   {
      while(true)
      {
         try
         {
            System.out.println("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            System.out.println("远程主机地址:" + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("谢谢连接我:" + server.getLocalSocketAddress() + "\nGoodbye!");
            server.close();
         }catch(SocketTimeoutException s)
         {
            System.out.println("Socket timed out!");
            break;
         }catch(IOException e)
         {
            e.printStackTrace();
            break;
         }
      }
   }
   public static void main(String [] args)
   {
      int port = Integer.parseInt(args[0]);
      try
      {
         Thread t = new GreetingServer(port);
         t.run();
      }catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}

编译以上两个 java 文件代码,并执行以下命令来启动服务,使用端口号为 6066:

$ javac GreetingServer.java 
$ java GreetingServer 6066
等待远程连接,端口号为:6066...

新开一个命令窗口,执行以上命令来开启客户端:

$ javac GreetingServer.java 
$ java GreetingServer 6066
等待远程连接,端口号为:6066...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三十八、java版 SpringCloud分布式微服务云架构之Java 网络编程 的相关文章

随机推荐

  • 基于MATLAB GUI的LSB语音信号数字水印

    基于MATLAB GUI的LSB语音信号数字水印 数字水印是一种在数字媒体中嵌入信息的技术 它可以用于版权保护 身份验证以及数据完整性验证等应用 在本文中 我们将介绍如何使用MATLAB GUI和最低有效位 Least Significan
  • Vue2.0知识点

    Vue2 0指令 v text指令 内容渲染指令 它会覆盖元素内部原有的内容 语法 插值表达式 专门用来解决v text会覆盖默认文本内容的问题 v text和插值表达式只能渲染纯文本内容 插值表达式不能用到属性节点 v html指令 可以
  • FFmpeg H264增加SEI

    先看使用场景 https blog csdn net lsheevyfg article details 80951415 https www jianshu com p 4d9120dfcd69 参考文章 https blog csdn
  • 【Python基础】Jupyter Notebook最常用的五大配置技巧

    说到Jupyter Notebook 以下简称Jupyter 想必很多人都不陌生 这是一款神奇的web应用 权且可以把它当作python超级笔记本 当然它还支持R Julia Scala Js等几十种语言 在Jupyter上 可以使用pyt
  • Spring Security OAuth2.0(四)-----OAuth2+JWT

    传统的通过 session 来记录用户认证信息的方式我们可以理解为这是一种有状态登录 而 JWT 则代表了一种无状态登录 无状态登录天然的具备单点登录能力 1 无状态登录 1 1 什么是有状态 有状态服务 即服务端需要记录每次会话的客户端信
  • Python中__str__的用法

    str 和 repr 如果要把一个类的实例变成 str 就需要实现特殊方法 str 不使用 str print打印出来是个对象 使用了就把对象变成字符串 class Person object def init self name gend
  • 蓝桥杯模块练习6-AD

    main c include
  • ag-grid Column API(机器翻译)

    Column API 一些API方法采用colKey类型为的列关键字 名为 Column string 这意味着您可以传递一个Column对象 通过调用其他方法之一接收到的对象 也可以传递Column ID 即string 列ID是列定义的
  • 【毕业设计】深度学习卫星遥感图像检测与识别系统(目标检测)

    文章目录 0 前言 1 课题背景 2 实现效果 3 Yolov5算法 4 数据处理和训练 5 最后 0 前言 Hi 大家好 这里是丹成学长的毕设系列文章 对毕设有任何疑问都可以问学长哦 这两年开始 各个学校对毕设的要求越来越高 难度也越来越
  • 远程控制,从个人便捷走向企业安全

    根据风险基础安全 Risk Based Security 的数据显示 2020年全球数据泄漏达到360亿条 创历史新高 对比传统的网络安全威胁 数据安全威胁更加多样化 80 的安全风险来自于内部人员或合作伙伴 威胁形式也更集中在账号体系薄弱
  • mybatis中association和collection的column传入多个参数问题

    mybatis中association和collection的column传入多个参数值 项目中在使用association和collection实现一对一和一对多关系时需要对关系中结果集进行筛选 如果使用懒加载模式 即联合使用select
  • mysql mariadb不能启动原因_centOS7 (64) MariaDB无法启动 跪求解决方法

    在CentOS7中mysql被 MariaDB所代替 幸得 贵在坚持 提点 顺利下载 MariaDB等相关软件但是安装完毕后 mariadb还是无法正常启动 root localhost service mariadb start Redi
  • mysql怎么替换部分字符串

    mysql替换部分字符串的方法 1 使用REPLACE 函数 语法 REPLACE 字符串 查找值 替换值 2 使用INSERT 函数 语法 INSERT 字符串 替换开始位置 要替换的字符数 替换值 mysql替换部分字符串 1 使用RE
  • 多租户mysql架构_团队开发框架实战—多租户架构

    1 对多租户的理解 多租户定义 多租户技术或称多重租赁技术 简称SaaS 是一种软件架构技术 是实现如何在多用户环境下 此处的多用户一般是面向企业用户 共用相同的系统或程序组件 并且可确保各用户间数据的隔离性 简单讲 在一台服务器上运行单个
  • XSS 跨站脚本

    XSS 跨站脚本 一 什么是XSS XSS Cross site Scripting 中文名跨站脚本攻击 其原理是攻击者利用浏览器执行前端代码 HTML CSS JavaScript 的特性 将恶意的JavaScript代码插入到页面中 当
  • LVGL动态图GIF实现 v7 version

    lvglv8 1以上的版本自带动态图库 github网址 LVGL GitHub 主要包含四个文件 gifdec c gifdec h lv gif c lvgif h 目录 lvgl release v8 1 lvgl release v
  • Cortex-AX系列性能对比

    首先要明确一个概念 Cortex并不是一种架构 而是ARM的一个系列 Cortex A系列 而我们通常意义的ARM7 ARM9 ARM11才是所谓的架构 同时需注意 Cortex A5 Cortex A8 Cortex A9 Cortex
  • ELF文件格式

    在介绍ELF格式之前 先简单说明一下可执行文件的生成流程 1 编写C源文件 或汇编源文件 2 准备共享库格式的目标文件 shared object file 如数学库 标准库 2 用编译器 compiler 将C编译成可重定位格式的目标文件
  • 关于pickle的load,loads等

    基础知识 python自带的file函数只能存储和读取字符串格式的数据 pickle可以存储和读取成其他格式比如list dict的数据 来自 https www zhihu com question 38355589 如需更详细 关于lo
  • 三十八、java版 SpringCloud分布式微服务云架构之Java 网络编程

    Java 网络编程 网络编程是指编写运行在多个设备 计算机 的程序 这些设备都通过网络连接起来 java net 包中 J2SE 的 API 包含有类和接口 它们提供低层次的通信细节 你可以直接使用这些类和接口 来专注于解决问题 而不用关注