第二十一章网络通信总结

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 stub
		Notification 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.mfbz.cn/a/231107.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day05 linux高级系统设计 - 管道

复制文件描述符 dup函数 作用&#xff1a; 文件描述符复制 语法&#xff1a; #include <unistd.h> int dup (int oldfd); 参数&#xff1a; 所需复制得文件描述符 返回值&#xff1a; 复制到的文件描述符 功能&#xff1a; 从文件描述符表中&#xff0c;找一个最小…

SSH原理与应用与探索

Secure Shell(SSH 安全外壳协议) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议&#xff0c;可有效弥补网络中的漏洞。通…

Java预科知识

以下内容是根据狂神的Java说、chatgpt和csdn相关博客&#xff0c;结合自己的理解完成的。 Java了解 基于Java 开发了巨多的平台&#xff0c;系统&#xff0c;工具 构建工具&#xff1a; Ant, Maven, Jekins应用服务器&#xff1a;Tomcat, Jetty, Jboss, Websphere, weblogic…

vue的data

类型&#xff1a;Object | Function 限制&#xff1a;组件的定义只接受 function。 详细&#xff1a; Vue 实例的数据对象。Vue 会递归地把 data 的 property 转换为 getter/setter&#xff0c;从而让 data 的 property 能够响应数据变化。对象必须是纯粹的对象 (含有零个或多个…

vertica主键列能插入重复值的处理办法

问题描述 开发同事反馈在vertica中创建含主键列的表中插入重复数据时没有进行校验&#xff0c;插入重复值成功。经过测试着实可以插入重复值&#xff0c;这个坑有些不一样。 创建表和插入语句如下&#xff1a; --创建表 CREATE TABLE dhhtest(ID VARCHAR(64) PRIMARY KEY );…

快速认识什么是:Docker

Docker&#xff0c;一种可以将软件打包到容器中并在任何环境中可靠运行的工具。但什么是容器以及为什么需要容器呢&#xff1f;今天就来一起学快速入门一下Docker吧&#xff01;希望本文对您有所帮助。 假设您使用 Cobol 构建了一个在某种奇怪风格的 Linux 上运行的应用程序。您…

linux 定时任务

使用 crontab Usage: crontab [-u user] [-e|-l|-r] Crontab 的格式说明如下: * 逗号(‘,’) 指定列表值。如: “1,3,4,7,8″ * 中横线(‘-’) 指定范围值 如 “1-6″, 代表 “1,2,3,4,5,6″ * 星号 (‘*’) 代表所有可能的值 */15 表示每 15 分钟执行一次 # Use the ha…

Python中type、object和class的关系,一图即懂

没有文字描述&#xff0c;因为图足够好&#xff01; 查看一个类的基类可以使用__bases__方法查看一个实例对应的类是谁&#xff0c;可以用__class__方法 class Animal:pass class User:pass class Dog(Animal, User):passif __name__ "__main__":print(Dog.__bases…

linux初级学习

(420条消息) 红帽认证-RHCSA_rhcsa红帽认证_yyyzf的博客-CSDN博客 OS&#xff1a;用户和机器的接口&#xff0c;UI:CMD,GUI shell: 通用格式 命令 选项&#xff08;调控功能&#xff09; 参数&#xff08;操作对象&#xff09;参数 省略参数对象一般使用当前目录作为参数对…

Linux下C++静态链接库的生成以及使用

目录 一.前言二.生成静态链接库三.使用静态链接库 一.前言 这篇文章简单讨论一下Linux下如何使用gcc/g生成和使用C静态链接库&#xff08;.a文件&#xff09;。 二.生成静态链接库 先看下目录结构 然后看下代码 //demo.h#ifndef DEMO_H #define DEMO_H#include<string&g…

C#-快速剖析文件和流,并使用

目录 一、概述 二、文件系统 1、检查驱动器信息 2、Path 3、文件和文件夹 三、流 1、FileStream 2、StreamWriter与StreamReader 3、BinaryWriter与BinaryReader 一、概述 文件&#xff0c;具有永久存储及特定顺序的字节组成的一个有序、具有名称的集合&#xff1b; …

题目:挑选子串(蓝桥OJ 1621)

题目描述&#xff1a; 解题思路&#xff1a; 采用双指针的快慢指针。与蓝桥OJ1372类似。 图解 题解&#xff1a; #include <bits/stdc.h> using namespace std;const int N 1e5 9; int a[N];int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int n, m…

网站内容审核功能的重要性

网站内容审核功能的重要性在保护用户权益、维护网站形象、遵守法律法规等方面都起到了至关重要的作用。 维护网站的合法性和道德性&#xff1a;网站内容审核功能的存在可以帮助过滤和删除违法、淫秽、恶意、诈骗等不良内容&#xff0c;保证网站内容的合法性和道德性。 保护用…

实现跨VLAN通信、以及RIP路由协议的配置

一、如下图片&#xff1a; 1. 按照拓扑图所示&#xff0c;将8台计算机分别配置到相应的VLAN中。&#xff08;20分&#xff09; 2. 配置实现同一VLAN中的计算机可以通信。&#xff08;22分&#xff09; 3. 配置实现PC1,PC2,PC3,PC4可以互相通信&#xff0c;PC5,PC6,PC7,PC8可以互…

面向对象中的单例模式

1、什么是设计模式 设计模式就是前人根据实际的问题提出的问题解决方案&#xff0c;我们把这种就称之为设计模式。 2、单例模式 单例模式是一种常见的设计模式&#xff01; 所谓的设计模式&#xff0c;不是一种新的语法&#xff0c;而是人们在实际的应用中&#xff0c;面对…

计算机考研408-计算机网络、操作系统整书知识点脑图

计算机网络、操作系统整书知识点脑图 今天突然想起来考研期间为了方便记忆&#xff0c;费了很大力气整理了计算机网络、操作系统两本书知识点的脑图&#xff0c;想着放着也没啥用&#xff0c;分享出来给大家看看 但是思维导图格式的东西好像没法直接发成文章&#xff0c;要是…

(三潮来袭)探寻2023年科技变革潮流与2024年前瞻展望

2023年对于IT行业来说是一个动荡而又充满变革的一年。随着世界逐渐走出前几年的挑战&#xff0c;企业逐渐复苏&#xff0c;但这个行业仍然在经历着激烈的变革。在这个时候&#xff0c;我们看到了一些引人注目的技术变化和未来的趋势。 一、2023年回顾 关键词&#xff1a;Chat…

手持式安卓主板_PDA安卓板_智能手持终端方案

手持式安卓主板方案是一种智能终端设备&#xff0c;具备自动对焦和闪光灯功能&#xff0c;可以在昏暗的环境下快速扫描二维码并轻松采集数据。该方案还提供多渠道支付和数据采集功能&#xff0c;为用户提供了便捷的体验。 该方案的产品基于手持式安卓主板&#xff0c;并搭载了八…

Unity中后处理简介

文章目录 前言一、后处理的原理二、我们看一下Unity文档中&#xff0c;内置的后处理前后的效果后处理前&#xff1a;后处理后&#xff1a; 前言 我们在这篇文章中&#xff0c;了解一下Unity中的后处理效果 后期处理概述 一、后处理的原理 在后处理的过程中&#xff0c;我们主…

爱智EdgerOS之深入解析安全可靠的开放协议SDDC

一、协议简介 在 EdgerOS 的智慧生态场景中&#xff0c;许多智能设备或传感器的生命周期都与 SDDC 协议息息相关&#xff0c;这些设备可能是使用 libsddc 智能配网技术开发的&#xff0c;也有可能是因为主要功能上是使用其他技术如 MQTT、LoRa 等但是设备的上下线依然是使用上…
最新文章