第21章网络通信

网络程序设计基础

        网络程序设计编写的是与其他计算机进行通信的程序。Java 已经将网络程序所需要的元素封

装成不同的类,用户只要创建这些类的对象,使用相应的方法,即使不具备有关的网络支持,也可

以编写出高质量的网络通信程序。

局域网与互联网

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

 服务器是指提供信息的计算机程序

客户机是指请求信息的计算机或程序

网络用于连接服务器与客户机,实现两者的相互通信。但是,有时在某个网络中很难将服务器与客户机区分开。局域网 (LAN) 是一群通过一定形式连接起来的计算机,它可以由两台计算机组成,也可以由同一区域内地上千台计算机组成。将 LAN 延伸到更大的范围,这样的网络成为广域网(WAN)。互联网是由无数的 LAN 和 WAN 组成的。

网络协议

        网络协议规定了计算机之间连接的物理、机械(网络与网卡的连接规定)、电气(有效的电平范围)等特征,计算机之间的相互寻址规则,数据发送冲突的解决方式,长数据如何分段传送与接收等内容。

  IP协议

        IP 是 Internet Protocol 的简称,是一种网络协议。Internet 网络采用的协议是 TCP/IP协议。TCP/IP 模式是一种层次结构,共分为 4 层,分别为应用层、传输层、互联网层和网络层。各层实现特定的功能,提供特定服务和访问接口,并具有相对的独立性。

TCP/IP 协议

在TCP/IP 协议栈中有两个高级协议 :

传输控制协议(TCP)

用户数据报协议(UDP)

端口域套接字

        一般而言,一台计算机只有单一的连接到网络的物理连接,所以的数据读通过此连接对内、

对外送达特定的计算机,这就是端口。网络程序设计的端口(port)并非真实的物理存在,而是一

个假想的连接装置。

        网络程序中的套接字(Socket)用于将应用程序 与端口连接起来。套接字是一个假想的连接装置,就像插座一样可以连接电器与电线。

TCP 程序

        TCP 网络程序设计是利用 Socket 类编写通信程序。利用 TCP 协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的功能和编写方法大不一样。

InterAddress 类

        java.net 包中的 InterAddress 类是与 IP 地址相关的类,利用该类可以获取 IP 地址、主机地址等信息。

例题21.1:

import java.net.*;public class Demo21_1 {public static void main(String[] args) {InetAddress ip;//创建InetAddress对象try {//捕捉异常ip=InetAddress.getLocalHost();//实例化对象String ming=ip.getHostName();//获取本机名String dizi=ip.getHostAddress();//获取本机地址System.out.println("本机名:"+ming);//输出本机名System.out.println("本机IP地址:"+dizi);//将本机IP地址输出} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();//输出异常}}}
结果:

ServerSocket 类

          java.net 包中的 ServerSocket 类用于表示服务器套接字,其主要功能是等待来自网络上的

“请求”,它可以通过指定的端口来等待连接的套接字。服务器套接字一次可以与一个套接字。如果

多台客户机同时提供出连接请求,服务器套接字会将请求连接的客户机存入列队中,然后从中取出

一个套接字,与服务器新建的套接字连接起来。若请求连接大于最大容纳数,则多出的连接请求被

拒绝。队列的默认大小是 50。

        ServerSocket 类的构造方法通常会抛出 IOException 异常,具体有以下几种形式:

  • ServerSocket(): 创建非绑定服务器套接字。
  • ServerSocket(int port): 创建绑定到特定端口的服务器套接字。
  • ServerSocket(int port,int backlog): 利用指定的 backlog 创建服务器套接字,并将其绑定到指定的本地端口号上。
  • ServerSocket(int port,int backlog,InetAddress bindAddress): 使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。这种情况适用于计算机上有多块网卡和多个IP 地址的情况,用户可以明确规定 ServerSocket 在哪块网卡或哪个 IP 地址上等待客户的连接请求。

TCP 网络程序设计

例题21.2:创建 TCP/IP 协议服务器,本实例是一个 TCP服务器端程序。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class Demo21_2 {private ServerSocket s;//服务器套接字private Socket sk;//客户端套接字void start() {//启动服务器try {s=new ServerSocket(8998);//服务器启用8998端口System.out.println("服务器套接字已经创建成功");while(true) {System.out.println("等待客户机的接入");sk=s.accept();//监听客户机的连接BufferedReader r=new BufferedReader(new InputStreamReader(sk.getInputStream()));while(true) {//循环接收信息String m=r.readLine();//读取一行文本if("退出".equals(m)) {//如果客户机发来的内容为退出System.out.println("客户机退出");break;//停止接收信息}System.out.println("客户机"+m);}r.close();//关闭流sk.close();//关闭套接字}}catch(IOException e) {e.printStackTrace();}}public static void main(String[] args) {Demo21_2 tcp=new Demo21_2();tcp.start();//启动服务器}}
结果:

运行服务器端程序,将输出提示信息,等待客户呼叫。下面再来看一下客户端程序。

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class Demo21_2_2 extends JFrame{private PrintWriter w;//字符输出流Socket s;//客户端套接字private JTextArea area=new JTextArea();//文本域private JTextField text=new JTextField();//文本框public Demo21_2_2() {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) {w.println(text.getText().trim());//将文本框的信息写入流area.append(text.getText()+"\n");//将文本框的信息显示在文本域中text.setText("");//将文本框清空}});}public void c() {//连接服务器方法area.append("尝试连接\n");//文本域中提示信息try {s=new Socket("127.0.0.1",8998);//连接本地计算机的端口8998w=new PrintWriter(s.getOutputStream(),true);area.append("完成连接\n");}catch(IOException e) {e.printStackTrace();}}public static void main(String[] args) {Demo21_2_2 c=new Demo21_2_2();c.setSize(200, 200);//窗体大小c.setVisible(true);//是否显示c.c();//连接服务器}}
结果:

UDP 程序

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

        基于 UDP 通信的基本模式如下:

将数据打包 (称为数据包),然后将数据包发往目的地。
 接收别人发来的数据包,然后查看数据包。

         发送数据包的步骤如下:

使用 DatagramSocket() 创建一个数据包套接字。
使用 DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)创建要发送的
数据包。
使用 DatagramSocket 类的 send() 方法发送数据包。

        接收数据包的步骤如下:

使用 DatagramSocket(int port) 创建数据包套接字,绑定到指定的端口。
使用 DatagramPacket(byte[]buf,int length) 创建字节数组来接收数据包。
使用 DatagramPacket 类的 receive() 方法接收UDP包。

DatagramPacket 类

        java.net 包的 DatagramPacket 类用来表示数据包。DatagramPacket 类的构造方法如下:

DatagramPacket(byte[] buf, int length)
DatagramPacket(byte[] buf, int length, InetAddress address, int port).

         第一种构造方法在创建 DatagramPacket 对象时,指定了数据包的内存空间和大小。第二种构造方法不仅指定了数据包的内存空间和大小,还指定了数据包的目标地址和口、在发送数据时,必须指定接收方的 Socket 地址和端口号,因此使用第二种构造方法可创建发送数据的 DamgramPacket 对象。

DatagramSocket 类

        javanet 包中的 DatagramSocket 类用于表示发送和接收数据包的套接字。该类的构造方法如下:

DatagramSocket()
DatagramSocket(int port)
DatagramSocket(int port, InetAddress addr)

        第一种构造方法创建 DatagramSocket 对象,构造数据报套接字,并将其绑定到本地主机任何可用的端口上。第二种构造方法创建 DatagramSocket 对象,创建数据报套字,并将其绑定到本地主机的指定端口上。第三种构造方法创建 DatagramSocket 对象,创建数据报套接字,并将其绑定到指定的端口和指定的本地地址上。第三种构造函数适用于有多块网卡和多个 IP 地址的情况。 

UDP 网络程序设计

例题21.3:创建 UDP 协议广播电台程序,广播主机程序不断地向外播出信息。
 

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

接收数据程序。代码如下:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;public class Demo21_3_2  extends JFrame implements Runnable,ActionListener{int port=9898;InetAddress  group=null;MulticastSocket socket=null;JButton inceBth=new JButton("开始接收");JButton stopBth=new JButton("停止接收");JTextArea inceAr=new JTextArea(10,10);JTextArea inced=new JTextArea(10,10);Thread thread;boolean stop=false;public Demo21_3_2() {setTitle("广播数据");setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);thread=new Thread(this);inceBth.addActionListener(this);stopBth.addActionListener(this);inceAr.setForeground(Color.blue);JPanel north=new JPanel();north.add(inceBth);north.add(stopBth);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();try {group=InetAddress.getByName("224.225.10.1");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 date[] = new byte[1024];DatagramPacket packet=null;packet=new DatagramPacket(date,date.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()==inceBth) {inceBth.setBackground(Color.red);stopBth.setBackground(Color.yellow);if(!(thread.isAlive())) {thread=new Thread(this);}thread.start();stop=false;}if(e.getSource()==stopBth) {inceBth.setBackground(Color.yellow);stopBth.setBackground(Color.red);stop=true;}}public static void main(String[]args) {Demo21_3_2 rec=new Demo21_3_2();rec.setSize(460, 200);}
}
结果: 

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

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

相关文章

2023年【危险化学品生产单位安全生产管理人员】考试题库及危险化学品生产单位安全生产管理人员考试技巧

题库来源:安全生产模拟考试一点通公众号小程序 危险化学品生产单位安全生产管理人员考试题库是安全生产模拟考试一点通总题库中生成的一套危险化学品生产单位安全生产管理人员考试技巧,安全生产模拟考试一点通上危险化学品生产单位安全生产管理人员作业…

【教程】制作 iOS 推送证书

如需向 iOS 设备推送数据,您首先需要在消息推送控制台上配置 iOS 推送证书。iOS 推送证书用于推送通知,本文将介绍消息推送服务支持的证书类型,并引导您制作 iOS 推送证书。 证书类型 消息推送服务仅支持 Apple Push Service 类型的证书。有…

react Hooks之useDebugValue

1、作用: 用于在开发过程中帮助开发者调试自定义 Hook。它的作用是将自定义 Hook 中的某些值暴露给 React 开发工具(例如 React DevTools)以便于调试。 当我们使用 React 开发工具查看组件的状态时,React DevTools 会从组件和其…

鸿蒙(HarmonyOS)应用开发——保存应用数据

保存应用数据 harmonyOS系统提供了四种数据存储方式 #mermaid-svg-kZlN0CFY1VGySIPo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-kZlN0CFY1VGySIPo .error-icon{fill:#552222;}#mermaid-svg-kZlN0CFY1VGySIPo .…

竞赛保研 LSTM的预测算法 - 股票预测 天气预测 房价预测

0 简介 今天学长向大家介绍LSTM基础 基于LSTM的预测算法 - 股票预测 天气预测 房价预测 这是一个较为新颖的竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 1 基于 Ke…

Android RecyclerView 动画处理 流程 原理(源码分析第二篇)

零、本文主题 本文要解决的问题: 1. Recyclerview 动画的实现原理是什么? 2. 处理的主要流程大概是怎样的? 一、核心原理 我们抛开代码,想一下,RecyclerView中的view动画有几种? 添加一个view:…

react Hooks之useLayoutEffect和useInsertionEffect

在介绍这两个hooks之前。让我们先对比一下useEffect、useLayoutEffect、useInsertionEffect 执行时机: useEffect 在组件渲染完成后执行,属于异步执行。useInsertionEffect 在组件渲染并插入 DOM 后执行,也属于异步执行。useLayoutEffect 在组…

互联网公司,哪个部门才是鄙视链最顶端?

文章目录 每日一句正能量前言财务部法务部公关部销售部前台行政IT部创意部后记 每日一句正能量 我们必须在失败中寻找胜利,在绝望中寻求希望。 前言 在互联网公司中,不同职位的鄙视链是存在的。有些职位享有高尚的地位,而有些则被看作是次要…

python 爬虫 m3u8 视频文件 加密解密 整合mp4

文章目录 一、完整代码二、视频分析1. 认识m3u8文件2. 获取密钥,构建解密器3. 下载ts文件4. 合并ts文件为mp4 三、总结 一、完整代码 完整代码如下: import requests import re import os from tqdm import tqdm from Crypto.Cipher import AES# 创建临…

Shopify二次开发之五:元字段(Metafields)

目录 解释 操作 1、添加Custom data 2、选择特定类型的数据 3、为Page配置元子段和值 4、模板访问 解释 Shopify Metafields 是一种用于存储和管理自定义数据的功能。它们允许商户在商城中的产品、订单、客户、Page等对象上添加自定义字段,以满足特定业务需求…

c语言->自定义类型联合体和枚举类型

系列文章目录 文章目录 前言 ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青_C语言,函数,指针-CSDN博客 目的:学习联合体和枚举类型的…

[cleanrl] ppo_continuous_action源码解析

1 import库(略) import os import random import time from dataclasses import dataclassimport gymnasium as gym import numpy as np import torch import torch.nn as nn import torch.optim as optim import tyro from torch.distributions.normal…

Kubernetes实战(八)-防止k8s namespace被误删除

1 背景 运维新同学在预发环境操作删除pod的时候,不知道什么原因把kubectl delete pod命令敲成了kubectl delete ns pre把预发环境删了,几十个模块,将近一个小时才恢复。幸亏是测试环境啊,如果是生产可以可以跑路了。 2 解决方案…

jsonpath:使用Python处理JSON数据

使用Python处理JSON数据 25.1 JSON简介 25.1.1 什么是JSON JSON全称为JavaScript Object Notation,一般翻译为JS标记,是一种轻量级的数据交换格式。是基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清…

java对二维数组进行排序

一、按行排序&#xff1a; 对二维数组按进行排序&#xff0c;直接调用Arrays.sort就行&#xff1a; private static int [][] sortRows(int[][] arr) {//行排序for (int i 0; i < arr.length; i) {Arrays.sort(arr[i]);}return arr;}二、按列排序&#xff1a; 1.使用比较…

计算机网络:应用层(一)

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

鸿蒙开发之状态管理@Observed和@ObjectLink

一、使用场景 当对象内引用对象&#xff0c;改变内部对象属性的时候其他状态管理如State、Provide、Consume等是无法触发更新的。同样&#xff0c;在数组内如果有对象&#xff0c;改变对象的属性也是无法更新的。在这种情况下就可以采用Observed和ObjectLink装饰器了。 二、使…

C# WPF上位机开发(简易图像处理软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 图像处理是工业生产重要的环节。不管是定位、测量、检测还是识别&#xff0c;图像处理在工业生产中扮演重要的角色。而c#由于自身快速开发的特点&a…

玩转 Go 语言并发编程:Goroutine 实战指南

一、goroutine 池 本质上是生产者消费者模型在工作中我们通常会使用可以指定启动的 goroutine 数量-worker pool 模式&#xff0c;控制 goroutine 的数量&#xff0c;防止 goroutine 泄漏和暴涨一个简易的 work pool 示例代码如下&#xff1a; package mainimport ("fmt…

小程序跳转tabbar,tabbar页面不刷新

文章地址&#xff1a;12.小程序 之切换到tabBar页面不刷新问题_360问答 解决办法备份&#xff1a; wx.switchTab&#xff1a;跳转到 tabBar 页面&#xff0c;并关闭其他所有非 tabBar 页面 wx.reLaunch&#xff1a;关闭所有页面&#xff0c;打开到应用内的某个页面。 wx.reLa…