Java学习-21 网络编程

什么是网络编程?

可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)

基本的通信架构

基本的通信架构有2种形式:

CS架构(Client客户端/Server服务端)   

BS架构(Browser浏览器/Server服务端)。

网络通信三要素

IP

01

端口

02

协议

03

设备在网路中的地址,是唯一的标识应用程序在设备中唯一的标识链接和数据在网络中传输的规则

InetAddress

代表IP地址

名称说明
getLocalHost()获取本机IP,会以一个inetAddress的对象返回
getByName(String host)根据ip地址或者域名,返回一个inetAdress对象
getHostName()获取该ip地址对象对应的主机名。
getHostAddress()获取该ip地址对象中的ip地址信息。
isReachable(int timeout)在指定素秒内,判断主机与该ip对应的主机是否能连通

端口

标记正在计算机设备上运行的应用程序的,被规定为一个16位的二进制,范围是0~65535.

分类

周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用80,FTP占用21)

注册端口:1024~49151,分配给用户进程或某些应用程序

动态端口:49152到65535,之所以称为动态端口,是因为它一般不固定分配某种进程,而是动态分配

注意:我们自己开发的程序一般选择使用注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错。

开放式网络互联标准:OSI网络参考模型

OSI网络参考模型:全球网络互联标准

TCP/IP网络模型:事实上的国际标准

OSI网络参考模型TCP/IP网络模型各层对应面向操作

应用层

应用层HTTP、FTP、SMTP应用程序需要关注的:浏览器、邮箱、程序员一般在这一层开发
表示层
会话层
传输层传输层UDP、TCP...选择使用的TCP,UDP协议
网络层网络层IP...封装源和目标IP
数据链路层数据链路层+物理层比特流...物理设备中传输
物理层

传输层的2个通信协议
UDP(User Datagram Protocol):用户数据报协议;TCP(Transmission ControlProtocol):传输控制协议。

UDP协议

  • 特点:无连接、不可靠通信。   通信效率高!语音通话视频直播
  • 不事先建立连接,数据按照包发,一包数据包含:自己的IP、程序端口,目的地IP、程序端口和数据(限制在64KB内)等。
  • 发送方不管对方是否在线,数据在中间丢失也不管,如果接收方收到数据也不返回确认,故是不可靠的。

TCP协议

  • 特点:面向连接、可靠通信,
  • TCP的最终目的:要保证在不可靠的信道上实现可靠的传输。
  • TCP主要有三个步骤实现可靠传输:三次握手建立连接,传输数据进行确认,四次挥手断开连接。

UDP通信

  • 特点:无连接、不可靠通信
  • 事先不建立连接;发送端每次把要发送的数据(限制在64KB内)、接收端IP等信息封装成一个数据包,发出去就不管了。
  • Java提供一个java.net.DatagramSocket类来实现UDP通信。

DatagramSocket:用于创建客户端、服务端

DatagramPacket:创建数据包

客户端实现步骤

  1. 创建DatagramSocket对象(客户端对象) ——> 扔韭菜的人
  2. 创建DatagramPacket对象封装需要发送的数据(数据包对象)——> 韭菜盘子
  3. 使用DatagramSocket对象的send方法,传入DatagramPacket对象 ——> 开始抛出韭菜
  4. 释放资源

 

public class Client {public static void main(String[] args) throws Exception {// 创建客户端对象DatagramSocket socket = new DatagramSocket(7777);// 创建数据包对象//public DatagramPacket(byte buf[], int offset, int length,//                          InetAddress address, int port)// 参数一:封装发出去的数据// 参数二: 发送出去的数据大小(字节个数)// 参数三:服务端的IP地址// 参数四:服务器程序的端口byte[] bytes = "我是快乐的客户端,我爱你abc".getBytes();DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(),6666);// 开始正式发送这个数据报的数据出去socket.send(packet);System.out.println("客户端数据发送完成~~");// 释放资源socket.close();}
}

服务端实现步骤

  1. 创建DatagramSocket对象并指定端口(服务端对象) ——> 接韭菜的人
  2. 创建DatagramPacket对象接收数据(数据包对象) ——> 韭菜盘子
  3. 使用DatagramSocket对象的receive方法,传入DatagramPacket对象 ——> 开始接收韭菜
  4. 释放资源
public class Server {public static void main(String[] args) throws Exception {System.out.println("服务端启动~~");// 创建一个服务器对象DatagramSocket socket = new DatagramSocket(6666);// 创建一个数据包对象,用于接收数据的byte[] buffer = new byte[1024 * 64];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);// 开始使用数据包来接收客户端发来的数据socket.receive(packet);//从字节数组中,把接收到的数据直接打印出来int len = packet.getLength();String rs = new String(buffer, 0, len);System.out.println(rs);System.out.println(packet.getAddress().getHostAddress());System.out.println(packet.getPort());socket.close();}
}

TCP通信

  • 特点:面向链接、可靠通信
  • 通信双方事先采用“三次握手”方式建立可靠连接,实现端到端的通信,底层能保证数据成功传给服务器。
  • Java提供一个java.net.Socket类来实现TCP通信

TCP通信 ——客户端开发

客户端程序就是通过java.net包下的Socket类实现的

构造器说明
public Socket(String host, int port)根据指定的服务器ip、端口号请求与服务端建立连接,连接通过,就获得了客户端socket
方法说明
public outputStream getOutputStream()获取字节输出流对象
public InputStream getInputStream()获得字节输入流对象
public class Client {public static void main(String[] args) throws Exception {// 创建Socket对象,并同时请求与服务程序的连接Socket socket = new Socket("127.0.0.1", 8888);// 从socket通信管道中得到一个字节输出流,用来发送数据给服务器OutputStream os = socket.getOutputStream();// 把低级的字节输出流包装成数据输出流DataOutputStream dos = new DataOutputStream(os);// 开始写数据dos.writeUTF("约会吗?");dos.close();socket.close();}
}

客户端实现步骤

  1. 创建客户端的Socket对象,请求与服务端的连接
  2. 使用socket对象调用getOutputStream()方法得到字节输出流
  3. 使用字节输出流完成数据的发送
  4. 释放资源:关闭管道close  

 

TCP通信——服务端程序的开发

服务端是通过java.net包下的ServerSocket类来实现的

ServerSocket

构造器说明
public ServerSocket(int port)为服务端程序注册端口
方法说明
public Socket accept()阻塞等待客户端的连接请求,一旦与某个客户端成功连接,则返回服务端这边的Socket对象
public class Server {public static void main(String[] args) throws Exception {System.out.println("服务器启动~~");// 创建ServerSocket对象 接收客户端数据ServerSocket serverSocket = new ServerSocket(8888);// ServerSocket对象accept方法 等待客户端发起请求 也是socketSocket socket = serverSocket.accept();// 从Socket管道中得到一个字节流输入InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);String str = dis.readUTF();System.out.println(str);// 获取IP地址System.out.println(socket.getRemoteSocketAddress());dis.close();serverSocket.close();}
}

服务端实现步骤

  1. 创建ServerSocket对象,注册服务端端口(与客户端一致)
  2. 调用ServerSocket对象的accept()方法,等待客户端的连接,并得到Socket管道对象
  3. 通过Socket对象调用getInputStream()方法得到字节输入流,完成数据的接收
  4. 释放资源:关闭socket管道

使用TCP通信实现:多发多收消息

客户端使用死循环,让用户不断输入消息

服务端也使用死循环,控制服务端收完消息,继续等待下一个消息

public class Client {public static void main(String[] args) throws Exception {// 创建Socket对象,并同时请求与服务程序的连接Socket socket = new Socket("127.0.0.1", 8888);// 从socket通信管道中得到一个字节输出流,用来发送数据给服务器OutputStream os = socket.getOutputStream();// 把低级的字节输出流包装成数据输出流DataOutputStream dos = new DataOutputStream(os);Scanner sc = new Scanner(System.in);while (true) {System.out.println("请说:");String str = sc.next();// 开始写数据if("exit".equals(str)){System.out.println("欢迎下次再来,退出成功~");dos.close();socket.close();break;}dos.writeUTF(str);}}
}public class Server {public static void main(String[] args) throws Exception {System.out.println("服务器启动~~");// 创建ServerSocket对象 接收客户端数据ServerSocket serverSocket = new ServerSocket(8888);while (true) {// ServerSocket对象accept方法 等待客户端发起请求 也是socketSocket socket = serverSocket.accept();// 从Socket管道中得到一个字节流输入InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);try {String str = dis.readUTF();System.out.println(str);} catch (Exception e) {System.out.println(socket.getRemoteSocketAddress() + "离线了");dis.close();serverSocket.close();break;}//System.out.println(socket.getRemoteSocketAddress());}}
}

TCP服务端与多个客户端通信(启动多线程)

public class Client {public static void main(String[] args) throws Exception {// 创建Socket对象,并同时请求与服务程序的连接Socket socket = new Socket("127.0.0.1", 8888);// 从socket通信管道中得到一个字节输出流,用来发送数据给服务器OutputStream os = socket.getOutputStream();// 把低级的字节输出流包装成数据输出流DataOutputStream dos = new DataOutputStream(os);Scanner sc = new Scanner(System.in);while (true) {System.out.println("请说:");String str = sc.next();// 开始写数据if("exit".equals(str)){System.out.println("欢迎下次再来,退出成功~");dos.close();socket.close();break;}dos.writeUTF(str);}}
}public class Server {public static void main(String[] args) throws Exception {System.out.println("服务器启动~~");// 创建ServerSocket对象 接收客户端数据ServerSocket serverSocket = new ServerSocket(8888);while (true) {// ServerSocket对象accept方法 等待客户端发起请求 也是socketSocket socket = serverSocket.accept();// 创建多线程处理new ServerReaderThread(socket).start();}}
}public class ServerReaderThread extends Thread {private final Socket socket;public ServerReaderThread(Socket socket){this.socket = socket;}@Overridepublic void run() {try {String name = Thread.currentThread().getName();InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);while (true) {try {String str = dis.readUTF();System.out.println(str);} catch (Exception e) {System.out.println(socket.getRemoteSocketAddress() + "下线了");socket.close();dis.close();break;}}} catch (Exception e) {e.printStackTrace();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/484383.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis源码阶段性完成

这个真的是耗费我很长的时间 一个是太忙了,一个是内容确实太多了 断断续续的,终于基本完成了,但也只限于基本哈 在这期间也阅读了相关书籍 其实书籍讲的都很好,讲了大体思路 但是,到具体实现细节就复杂的多了 因…

跟着pink老师前端入门教程(JavaScript)-day05

六、语句 (一)表达式和语句 1、表达式 表达式是可以被求值的代码,JavaScript 引擎会将其计算出一个结果。 2、语句 语句是一段可以执行的代码。 比如: prompt() 可以弹出一个输入框,还有 if语句 for 循环语句等…

常见消息中间件

ActiveMQ 我们先看ActiveMQ。其实一般早些的项目需要引入消息中间件,都是使用的这个MQ,但是现在用的确实不多了,说白了就是有些过时了。我们去它的官网看一看,你会发现官网已经不活跃了,好久才会更新一次。 它的单机吞…

Stable Diffusion 绘画入门教程(webui)-ControlNet(深度Depth)

上篇文章介绍了线稿约束,这篇文章介绍下深度Depth 文章目录 一、选大模型二、写提示词三、基础参数设置四、启用ControlNet 顾名思义,就是把原图预处理为深度图,而深度图可以区分出图像中各元素的远近关系,那么啥事深度图&#xf…

达梦数据库--DM8两节点DSC集群安装部署(达梦数据库DSC集群搭建)

1 前期规划 系统规划 本地磁盘规划 共享存储规划 DMDSC 集群为了实现多实例同时访问和修改数据,需要数据文件、控制文件和日志文件都放到共享存储上。DM 支持两种共享存储,裸设备和 DMASM,裸设备是未经过格式化的特殊字符设备,…

51单片机学习(3)-----独立按键控制LED的亮灭状态

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步了。 目录 一. 器件介绍及实验原理 1.独立按键 (1)独…

代码随想录算法训练营第二十五天|Leetcode216 组合总和III、Leetcode17 电话号码的字母组合

代码随想录算法训练营第二十五天|Leetcode216 组合总和III、Leetcode17 电话号码的字母组合 ● Leetcode216.组合总和III● 解题思路● 代码实现 ● Leetcode17 电话号码的字母组合● 解题思路● 代码实现 ● Leetcode216.组合总和III 题目链接:Leetcode216.组合总和…

【k近邻】Kd树的构造与最近邻搜索算法

【k近邻】 K-Nearest Neighbors算法原理及流程 【k近邻】 K-Nearest Neighbors算法距离度量选择与数据维度归一化 【k近邻】 K-Nearest Neighbors算法k值的选择 【k近邻】 Kd树的构造与最近邻搜索算法 【k近邻】 Kd树构造与最近邻搜索示例 Kd树是一种对K(与k近邻的k…

ChatGPT学习第二周

📖 学习目标 自然语言处理(NLP)简介 探索自然语言处理的基本原理,理解其在ChatGPT中的应用。 GPT模型概述 了解生成式预训练变换器(GPT)的工作原理。 ✍️ 学习活动 学习资料 《走进AI(三) | 解构 NLP…

Transformer 架构—Encoder-Decoder

文章目录 前言 一、Encoder 家族 1. BERT 2. DistilBERT 3. RoBERTa 4. XML 5. XML-RoBERTa 6. ALBERT 7. ELECTRA 8. DeBERTa 二、Decoder 家族 1. GPT 2. GPT-2 3. CTRL 4. GPT-3 5. GPT-Neo / GPT-J-6B 三、Encoder-Decoder 家族 1. T5 2. BART 3. M2M-100 4. BigBird 前言 …

CSB ---> (XXE)XML基础

本来今天想更一下CSbeacon上线多层的内网机器的,但是刚好今天是年后的第一节课,讲的是XXE的基础,那就来先盘一下基础!! 1.XXE XXE全称是XML External Entity即xml外部实体注入攻击!其后果会导致用户…

不要抱怨,不如抱 Java 运算符吧 (1)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…