第二十一章网络通信总结

21.1 网络程序设计基础

Java网络程序设计基础涉及使用Java编程语言创建网络应用程序。这通常涉及到使用Java的网络API,如java.net包,以建立客户端和服务器之间的通信。

基本步骤包括:

1.创建服务器: 使用ServerSocket类创建服务器,并通过accept()方法等待客户端连接请求。

2.创建客户端: 使用Socket类创建客户端,并连接到服务器。

3.建立输入输出流: 使用InputStream和OutputStream类创建输入和输出流,以在客户端和服务器之间传递数据。

4.处理数据: 在服务器端,通过输入流接收客户端发送的数据,并通过输出流将响应发送回客户端。

5.关闭连接: 当通信完成时,关闭连接,释放资源。

21.1局域网与互联网 

局域网(LAN)和互联网(Internet)是两种不同范围的网络,它们在覆盖范围、连接设备和应用方面有一些区别。

为了实现两台计算机的通信,必须用一个网络线路连接两台计算机

21.1.2 网络协议 

网络协议是计算机网络中用于在通信实体之间进行数据交换的一套规则和约定。它定义了数据的格式、传输方式、错误检测等规范,确保在网络中的设备能够正确地进行通信。以下是一些常见的网络协议:

TCP/IP协议: Transmission Control Protocol/Internet Protocol,是互联网上的基本通信协议。包括TCP用于可靠数据传输和IP用于数据包路由。

HTTP协议: HyperText Transfer Protocol,用于在Web浏览器和Web服务器之间传输超文本的协议。通常用于获取网页、图像等资源。

UDP协议: User Datagram Protocol,是一种无连接的传输协议,提供了不可靠的数据传输。常用于实时应用,如语音通话和视频流。

21.1.3 端口与套接字

一般而言,一台计算机只有单一的连到网络的物理连接 (Physical Connection),所有的数据都通过此连接对内、对外送达特定的计算机,这就是端口。网络程序设计中的端口(pot)并非真实的物理存在,而是一个假想的连接装置。端口被规定为一个在0~65535 的整数。HTTP 服务一般使用 80 端口FTP服务使用21端口。假如一台计算机提供了HTTP、FTP 等多种服务,那么客户机会通过不同的端口来确定连接到服务器的哪项服务上,如图21.3 所示。
通常,0~1023 的端口数用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用 1024以上的端口数,以避免端口号与另一个应用或系统服务所用端口冲突。
网络程序中的套接字(Socket)用于将应用程序与端口连接起来。套接字是一个假想的连接装置就像插座一样可连接电器与电线,如图 21.4所示。Java 将套接字抽象化为类,程序设计者只需创建 Socket类对象,即可使用套接字。

21.2 TCP程序 

TCP网络程序设计是指利用 Socket 类编写通信程序利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的功能和编写方法大不一样。服务系着与客户端的交互过程如图21.5 所示:

21.2.1 InetAddress类 

java.net 包中的 InetAddress 类是与 IP 地址相关的类,利用该类可以获取 IP 地址、主机地址等信息.
InetAddress 类的常用方法如表 21.1 所示。

例题21.1:获取计算机的本机名与IP地址 

package 二十一;import java.net.InetAddress;
import java.net.UnknownHostException;public class Address {public static void main(String[] args) {InetAddress ip;try {ip = InetAddress.getLocalHost();String localname = ip.getHostName();String localip = ip.getHostAddress();System.out.println("本机名:" + localname);System.out.println("本机IP地址:" + localip);}catch(UnknownHostException e){e.printStackTrace();}}}

21.2.2 ServerSocket类 

ServerSocket类是Java中用于实现服务器端套接字的类,用于监听并接受客户端的连接请求。以下是对ServerSocket的简要概述:

1.创建服务器套接字: 通过构造函数可以创建一个服务器套接字,需要指定服务器端口号。

2.等待连接请求: 使用accept()方法阻塞等待客户端连接请求。一旦有客户端连接,该方法返回一个Socket对象,用于和该客户端进行通信。

3.获取输入输出流: 通过Socket对象获取输入流和输出流,以便与客户端进行数据交换。

4.关闭服务器套接字: 当不再接受新的连接时,使用close()方法关闭服务器套接字。

5.异常处理: 可能会抛出IOException等异常,需要进行适当的异常处理。

6.可选的构造函数: 除了上述基本的构造方法,还提供了一些其他构造方法,允许开发者指定绑定的IP地址、backlog(等待连接队列的最大长度)等参数。

ServerSocket类通常作为服务器应用程序的入口点,通过它可以实现基于TCP协议的服务器,与客户端进行双向通信。这对于构建网络应用程序,特别是服务器端的网络服务是至关重要的。

 21.2.3 TCP网络程序设计

明白了TCP 程序工作的过程,就可以编写 TCP 服务器程序了。在网络编程中,如果只要求客户机疆务器发送消息,不要求服务器向客户机发送消息,称为单向通信。客户机套接字和服务器套接字接成功后,客户机通过输出流发送数据,服务器则通过输入流接收数据。下面是简单的单向通信的实例

例题21.2:创建TCP/IP协议服务器

package 二十一;
import java.io.*;
import java.net.*;public class MyServer {private ServerSocket server; // 服务器套接字private Socket socket; // 客户端套接字void start() {// 启动服务器try {server = new ServerSocket(8998); // 服务器启用8998端口System.out.println("服务器套接字已经创建成功");while (true) {System.out.println("等待客户端的连接");socket = server.accept(); // 服务器监听客户端连接// 根据套接字字节流创建字符输入流BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));while (true) {// 循环接受信息String message = reader.readLine();// 读取一行文本if ("exit".equals(message)) {// 如果客户端发来的内容为“exit”System.out.println("客户端退出");break;// 停止接受信息}System.out.println("客户端:" + message);}reader.close(); // 关闭流socket.close(); // 关闭套接字}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {MyServer tcp = new MyServer();tcp.start(); // 启动服务器}
}

 

package 二十一;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.Socket;
import javax.swing.*;public class MyCllent extends JFrame {private PrintWriter writer;// 根据套接字字节流创建的字符输出流Socket socket; // 客户端套接字private JTextArea area = new JTextArea();// 展示信息的文本域private JTextField text = new JTextField(); // 发送信息的文本框public MyCllent() {setTitle("向服务器送数据");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Container c = getContentPane(); // 主容器JScrollPane scrollPane = new JScrollPane(area);// 滚动面板getContentPane().add(scrollPane, BorderLayout.CENTER);c.add(text, "South"); // 将文本框放在窗体的下部text.addActionListener(new ActionListener() {// 文本框触发回车事件public void actionPerformed(ActionEvent e) {writer.println(text.getText().trim()); // 将文本框中的信息写入流area.append(text.getText() + '\n'); // 将文本框中的信息显示在文本域中text.setText(""); // 将文本框清空}});}private void connect() { // 连接服务器方法area.append("尝试连接\n"); // 文本域中提示信息try {socket = new Socket("127.0.0.1", 8998); // 连接本地计算机的8998端口writer = new PrintWriter(socket.getOutputStream(), true);area.append("完成连接\n");} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {MyCllent clien = new MyCllent();clien.setSize(200, 200); // 窗体大小clien.setVisible(true); // 显示窗体clien.connect(); // 连接服务器}
}

 

21.3 UDP程序 

用户数据报协议(UDP) 是网络信息传输的另一种形式。基于 UDP 的通信和基于 TCP 的通信不同,基于 UDP的信息传递更快,但不提供可靠性保证。使用 UDP 传递数据时,用户无法知道数据能否正确地到达主机,也不能确定到达目的地的顺序是否和发送的顺序相同。虽然 UDP 是一种不可靠的协议,但如果需要较快地传输信息,并能容忍小的错误,可以考虑使用 UDP。

21.3.1 DatagramPacket类

DatagramPacket类是Java中用于表示数据报包的类,用于在UDP(用户数据报协议)通信中传输数据。UDP是一种无连接的、不可靠的传输协议,适用于一些对实时性要求较高的应用,如音频和视频传输。

21.3.2 DatagramSocket类 

DatagramSocket与DatagramPacket一起使用,通过DatagramSocket发送和接收UDP数据报。该类提供了一种简单而直接的方式来实现基于UDP的网络通信。在使用时,通常先创建一个DatagramSocket对象,然后通过该对象创建DatagramPacket并进行数据的发送和接收。

21.3.3 UDP网络程序设计

根据前面所讲的网络编程的基本知识以及 UDP 网络编程的特点,下面创建一个广播数据报程序广播数据报是一项较新的技术,其原理类似于电台广播。广播电台需要在指定的波段和频率上广播信息,收听者也要将收音机调到指定的波段、频率,才可以收听广播内容

例题21.3:创建UDP协议广播电台程序

package 二十一;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;public class Notification extends Thread {String weather = "节目预报:八点有大型晚会,请收听";int port = 9898;InetAddress iaddress = null;MulticastSocket socket = null;Notification() {try {iaddress = InetAddress.getByName("224.255.10.0");socket = new MulticastSocket(port);socket.setTimeToLive(1);socket.joinGroup(iaddress);}catch(IOException e){e.printStackTrace();}}public void run() {while(true) {DatagramPacket packet = null;byte data[] = weather.getBytes();packet = new DatagramPacket(data, data.length,iaddress,port);System.out.println(weather);try {socket.send(packet);sleep(3000);}catch(IOException e) {e.printStackTrace();}catch(InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {// TODO Auto-generated method stubNotification w = new Notification();w.start();}}

 

 

 

package 二十一;import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.net.*;
import javax.swing.*;public class Receive extends JFrame implements Runnable,ActionListener {int port;InetAddress group=null;MulticastSocket socket=null;JButton inceBtn=new JButton("开始接收");JButton stopBtn=new JButton("停止接收");JTextArea inceAr=new JTextArea(10,10);JTextArea inced=new JTextArea(10,10);Thread thread;boolean stop=false;public Receive() {setTitle("广播数据报");setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);thread=new Thread(this);inceBtn.addActionListener(this);stopBtn.addActionListener(this);inceAr.setForeground(Color.blue);JPanel north=new JPanel();north.add(inceBtn);north.add(stopBtn);add(north,BorderLayout.NORTH);JPanel center=new JPanel();center.setLayout(new GridLayout(1,2));center.add(inceAr);center.add(inced);add(center,BorderLayout.CENTER);validate();port=9898;try {group=InetAddress.getByName("224.255.10.0");socket=new MulticastSocket(port);socket.joinGroup(group);}catch(IOException e) {e.printStackTrace();}setBounds(100,50,360,380);setVisible(true);}public void run() {while(!stop) {byte data[]=new byte[1024];DatagramPacket packet=null;packet=new DatagramPacket(data,data.length,group,port);try {socket.receive(packet);String message=new String(packet.getData(),0,packet.getLength());inceAr.setText("正在接收的内容:\n"+message);inced.append(message+"\n");}catch(IOException e) {e.printStackTrace();}}}public void actionPerformed(ActionEvent e) {if(e.getSource()==inceBtn) {inceBtn.setBackground(Color.red);stopBtn.setBackground(Color.yellow);if(!(thread.isAlive())) {thread=new Thread(this);}thread.start();stop=false;}if(e.getSource()==stopBtn) {inceBtn.setBackground(Color.yellow);stopBtn.setBackground(Color.red);stop=true;}}public static void main(String[] args) {Receive rec=new Receive();rec.setSize(460,200);}
}

 结束力

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

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

相关文章

常见的中间件--消息队列中间件测试点

最近刷题,看到了有问中间件的题目,于是整理了一些中间件的知识,大多是在小破站上的笔记,仅供大家参考~ 主要分为七个部分来分享: 一、常见的中间件 二、什么是队列? 三、常见消息队列MQ的比较 四、队列…

12_企业架构之Tomcat部署使用

Tomcat 学习目标和内容 1、能够描述Tomcat的使用场景 2、能够简单描述Tomcat的工作原理 3、能够实现部署安装Tomcat 4、能够实现配置Tomcat的service服务和自启动 5、能够实现Tomcat的Host的配置 6、能够实现Nginx反向代理Tomcat 7、能够实现Nginx负载均衡到Tomcat 一、Tomcat介…

linux的定时任务Corntab

安装crontab # yum安装crontab yum install -y crontab# 开机自启crond服务并现在启动 systemctl enable --now crondcron系统任务调度 系统任务调度: 系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。 在/etc/crontab文件,这…

机器学习之全面了解回归学习器

我们将和大家一起探讨机器学习与数据科学的主题。 本文主要讨论大家针对回归学习器提出的问题。我将概要介绍,然后探讨以下五个问题: 1. 能否将回归学习器用于时序数据? 2. 该如何缩短训练时间? 3. 该如何解释不同模型的结果和…

No suitable driver found for jdbc:mysql://localhost:3306(2023/12/7更新)

有两种情况: 压根没安装下载了但没设为库或方法不对 大多数为第一种情况: 一. 下载jdbc 打开网址选择一个版本进行下载 https://nowjava.com/jar/version/mysql/mysql-connector-java.html 二.安装jdbc 在项目里建一个lib文件夹 在把之前下载的jar文…

优化 SQL 日志记录的方法

为什么 SQL 日志记录是必不可少的 SQL 日志记录在数据库安全和审计中起着至关重要的作用,它涉及跟踪在数据库上执行的所有 SQL 语句,从而实现审计、故障排除和取证分析。SQL 日志记录可以提供有关数据库如何访问和使用的宝贵见解,使其成为确…

JNPF低代码平台详解 -- 系统架构

目录 一、技术介绍 技术架构 二、设计原理 三、界面展示 1.代码生成器 2.工作流程 3.门户设计 4.大屏设计 5.报表设计 6.第三方登录 7.多租户实现 8.分布式调度 9.消息中心 四、功能框架 JNPF低代码是一款新奇、实用、高效的企业级软件开发工具,支持企…

Qt/C++音视频开发58-逐帧播放/上一帧下一帧/切换播放进度/实时解码

一、前言 逐帧播放是近期增加的功能,之前也一直思考过这个功能该如何实现,对于mdk/qtav等内核组件,可以直接用该组件提供的接口实现即可,而对于ffmpeg,需要自己处理,如果有缓存的数据的话,可以…

Rust的eBFP框架Aya(一) - Linux内核网络基础

前言 在我的Rust入门及实战系列文章中已经说明, Rust是一门内存安全的高性能编程语言,从它的这些优秀特性来看,就是一门专为系统开发而诞生的语言。至于很多使用Rust来进行web开发的行为,不能说它们不好,只能说是杀鸡…

2017下半年软工(桥接模式)

题目——桥接模式(抽象调用实现部分) package org.example.桥接模式;/*** 桥接模式的核心思想是将抽象部分与它的实现部分分离,使它们可以独立变化,就是说你在实现部分:WinImp、LinuxImp基础上还能加上RedHatImp&#…

uniapp 输入框输入时,会将内容顶上去的解决方案

// 设置页面最小高度 export const setPageMinHeight () > {return {position: relative,min-height: uni.getSystemInfoSync().windowHeight px} }页面使用: import {setPageMinHeight} from "/utils/uniUtil";data() {return {minHeight: setPag…

Unity 状态系统

状态系统 原理食用方法Demo 原理 #mermaid-svg-lUbxJ8eMP3KqrEhY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lUbxJ8eMP3KqrEhY .error-icon{fill:#552222;}#mermaid-svg-lUbxJ8eMP3KqrEhY .error-text{fill:#55…

官方officevisio在线安装包

在线安装包,在线就是要有网络环境,你能搜到这篇博客,就初步具备网络环境 visio在线安装包.zip官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 在线安装包如下,双击执行安装即可,可供选择的64/32位 软件的激活与…

【扩散模型】ControlNet从原理到实战

ControlNet从原理到实战 ControlNet原理ControlNet应用于大型预训练扩散模型ControlNet训练过程ControlNet示例1 ControlNet与Canny Edge2. ControlNet与Depth3. ControlNet与M-LSD Lines4. ControlNet与HED Boundary ControlNet实战Canny Edge实战Open Pose 小结参考资料 Cont…

Linux系统上RabbitMQ安装教程

一、安装前环境准备 Linux:CentOS 7.9 RabbitMQ Erlang 1、系统内须有C等基本工具 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel tk tc xz socat2、下载安装包 1)首先&a…

[linux] kaggle 数据集用linux下载

你可以通过以下步骤获取Kaggle的下载链接并在Linux中进行下载: 首先,确保你已经安装了Python和Kaggle API。如果没有安装,你可以通过以下命令安装: pip install kaggle 接着,你需要在Kaggle网站上获取API Token。登录…

【PyTorch】 暂退法(dropout)

文章目录 1. 理论介绍2. 实例解析2.1. 实例描述2.2. 代码实现2.2.1. 主要代码2.2.2. 完整代码2.2.3. 输出结果 1. 理论介绍 线性模型泛化的可靠性是有代价的,因为线性模型没有考虑到特征之间的交互作用,由此模型灵活性受限。泛化性和灵活性之间的基本权…

Docker构建自定义镜像

创建一个docker-demo的文件夹,放入需要构建的文件 主要是配置Dockerfile文件 第一种配置方法 # 指定基础镜像 FROM ubuntu:16.04 # 配置环境变量,JDK的安装目录 ENV JAVA_DIR/usr/local# 拷贝jdk和java项目的包 COPY ./jdk8.tar.gz $JAVA_DIR/ COPY ./docker-demo…

Java基础50题: 21.实现一个方法printArray, 以数组为参数,循环访问数组中的每个元素,打印每个元素的值.

概述 实现一个方法printArray, 以数组为参数,循环访问数组中的每个元素,打印每个元素的值. 代码 public static void printArray(int[] array) {for (int i 0; i < array.length; i) {System.out.println(array[i] " ");}System.out.println();}public static…

【日常总结】mybatis-plus WHERE BINARY 中文查不出来

目录 一、场景 二、问题 三、原因 四、解决方案 五、拓展&#xff08;全表全字段修改字符集一键更改&#xff09; 准备工作&#xff1a;做好整个库备份 1. 全表一键修改 Stage 1&#xff1a;运行如下查询 Stage 2&#xff1a;复制sql语句 Stage 3&#xff1a;执行即可…