第二十一章

网络通信这一章  基本分为三个部分  网络基础概念和TCP,UDP这三个部分主要如下:

计算机网络实现了堕胎计算机间的互联,使得它们彼此之间能够进行数据交流。网络应用程序就是再已连接的不同计算机上运行的程序,这些程序借助于网络协议,相互之间可以交换数据,编写网络应用程序前,首先必须明确网络协议TCP/IP协议是网络应用程序的首选

网络程序设计基础:

网络程序设计编写始于其他计算机进行通信的程序,java已经将网络程序所需要而定元素封装成不同的类,用户只要床啊金这些类的对象,使用相应的方法即使不举报相关的网络知识,也是可以编写除高质量的网络通信程序的,

本章最主要的是TCP和UDP两个部分  他们两主要的区别就是一个是一对一通信  一个是一对多通信   当然两者都有各自的优势和劣势,接下来先讲解 TCP部分
TCP程序

TCP程序的通信方式呢 是一对一的   步骤是  先要打开服务器然后客户端连接服务器  先是尝试客户端是否能够接收到信息  如果可以接收到信息的话  这时服务器将会把文件传输给客户端,这样的话 能够保证客户端可以接收到信息  ,劣势呢就是每次都是要这样子 所以效率对比起UDP来说慢下了好多  以下代码将会进行讲解

客户端代码:

package tcp;import java.io.*;
import java.net.Socket;
import java.util.Scanner;/*** Socket客户端**/
public class SocketClient {public static void main(String[] args) {Socket s = null;try {// 与ip为127.0.0.1、端口为12345的服务端建立连接s = new Socket("127.0.0.1", 12345);// 创建输入流接收服务端发送的消息(字节流)InputStream is = s.getInputStream();// 将服务端返回的字节流转化为字符流InputStreamReader isr = new InputStreamReader(is);// 创建字符流读取缓冲区,方便每行读取BufferedReader br = new BufferedReader(isr);// 创建输出流返回消息OutputStream os = s.getOutputStream();// 创建输出流缓冲PrintWriter pw = new PrintWriter(os);// 创建发送消息的线程Runnable rOut = () -> {boolean flag = true;while (flag) {try {// 接收控制台输入Scanner scan = new Scanner(System.in);String msg = scan.nextLine();// 将输入写入缓冲pw.println(msg);// 将缓冲内的数据推送至服务端并清空缓冲区pw.flush();} catch (Exception e) {flag = false;e.printStackTrace();}}};// 创建接收消息的线程Runnable rIn = () -> {boolean flag = true;while (flag) {try {// 逐行读取服务端返回的消息并打印String str = br.readLine();System.out.println("服务端的消息:" + str);} catch (IOException e) {flag = false;e.printStackTrace();}}};// 启动两个线程Thread tOut = new Thread(rOut);Thread tIn = new Thread(rIn);tOut.start();tIn.start();}catch (IOException e) {try {// 释放资源s.close();} catch (Exception exception) {exception.printStackTrace();}e.printStackTrace();}}
}

 服务端代码:

package tcp;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;/*** Socket服务端**/
public class SocketServer {public static void main(String[] args) {ServerSocket ss = null;Socket s = null;try {// 创建监听端口为12345的Socket服务端ss = new ServerSocket(12345);System.out.println("服务端Socket服务已建立,等待客户端连接...");// 通过ss.accept()开始持续监听12345端口,当有连接时获取收到的包装成Socket的客户端对象s = ss.accept();// 获取客户端的IP地址和端口号String ip = s.getInetAddress().getHostAddress();int port = s.getPort();System.out.println("服务端与 " + ip + ":" + port + " 已建立连接");// 创建输入流接收客户端发送的消息(字节流)InputStream is = s.getInputStream();// 将客户端发送的字节流转化为字符流InputStreamReader isr = new InputStreamReader(is);// 创建字符流读取缓冲区,方便每行读取BufferedReader br = new BufferedReader(isr);// 创建输出流返回消息OutputStream os = s.getOutputStream();// 创建输出流缓冲PrintWriter pw = new PrintWriter(os);// 创建接受信息的线程Runnable rIn = () -> {boolean flag = true;while (flag) {try {// 逐行读取客户端发送的消息并打印String str = br.readLine();System.out.println("客户端的消息:" + str);} catch (IOException e) {flag = false;e.printStackTrace();}}};// 创建发送消息的线程Runnable rOut = () -> {boolean flag = true;while (flag) {try {// 接收控制台输入Scanner scan = new Scanner(System.in);String msg = scan.nextLine();// 将输入写入缓冲pw.println(msg);// 将缓冲内的数据推送至客户端并清空缓冲区pw.flush();} catch (Exception e) {flag = false;e.printStackTrace();}}};// 开启两个线程Thread tIn = new Thread(rIn);Thread tOut = new Thread(rOut);tIn.start();tOut.start();} catch (IOException e) {try {// 释放资源ss.close();s.close();} catch (Exception exception) {exception.printStackTrace();}e.printStackTrace();}}
}

代码图如下:

运行结果如下所示:

接下来讲解UDP程序

UDP程序

UDP程序跟TCP程序不同的地方呢  TCP通信是一对一通信 如果要一下通知好多个人的话 就需要一个一个来通信  所以这时将会需要UDP了  UDP的优势就在于效率高 但是不稳定的地方呢  就是效率高但是不一定每个人都能看到  就像老师在台上讲课 总有一些学生会在台下玩手机 或者带耳机  不一定每一个人都能够接受得到  这就是UDP的不稳定的地方 ,接下来使用代码来讲解:

广播类代码如下:

package udp;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(){//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);//让线程休眠3000毫秒}catch(IOException e){e.printStackTrace();}catch(InterruptedException e) {e.printStackTrace();}}	}public static void main(String[]args) {Notification w =new Notification();w.start();//启动线程}
}

接收类代码如下:

package udp;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 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);//绑定按钮ince的单击事件stopBtn.addActionListener(this);//绑定按钮stop的单击事件inceAr.setForeground(Color.blue);//指定文本域中文字的颜色JPanel north = new JPanel();north.add(inceBtn);//将按钮添加到面板north上north.add(stopBtn);add(north,BorderLayout.NORTH);//将north放置在窗体的上部JPanel center = new JPanel();//创建面板对象centercenter.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() {//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) {//单机按钮ince出发时间if(e.getSource()==inceBtn) {inceBtn.setBackground(Color.red);//设置按钮颜色stopBtn.setBackground(Color.yellow);if(!(thread.isAlive())) {//如线程不处于“新建状态”thread = new Thread(this);//实例化Thread对象}thread.start();//启动线程stop = false;//开始接受信息}if(e.getSource()== stopBtn) {//单机按钮stop出发时间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.hqwc.cn/news/255941.html

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

相关文章

12.07

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//窗口设置//去掉表头this->setWindowFlags(Qt::FramelessWindowHint);//重新设置大小this->resize(800,420);//设置背景颜色this->setStyleSheet("background-color:whi…

SmartChart:一站式数据可视化解决方案

在当今的数据驱动的世界中,数据可视化已经成为了一个重要的工具,它可以帮助我们理解复杂的数据集,并从中提取有价值的信息。SmartChart就是这样一个强大的数据可视化工具,它提供了一站式的数据可视化解决方案,无论你是…

FL Studio2024破解版在哪里可以下载?

FL Studio软件全称是Fruity Loops Studio,由于这款软件自身logo长得像水果,所以我们也习惯叫它“水果”。它是一款全功能音频编辑工具,将编曲、剪辑、录音以及混音集为一体的音乐编曲软件,在计算机系统上安装一个FL Studio编曲软件…

Windows server 2019 域环境部署

环境准备 准备3台服务器,配置都是8g2核,50g硬盘,操作系统版本Windows Server 2019 Datacenter 域服务器:adc,192.168.56.120服务器1:server1:,192.168.56.121服务器2:server2&…

【学习笔记】LLM for Education

ChatGPT has entered the classroom: how LLMs could transform education 前言IntroductionThe risks are realEmbracing LLMsIntroducing the AI tutorAugmenting retrievalWill it catch on?总结 前言 一篇来自Nature的文章,探讨了教育行业的不同参与者&#x…

时间序列预测实战(二十五)PyTorch实现Seq2Seq进行多元和单元预测(附代码+数据集+完整解析)

一、本文介绍 本文给大家带来的时间序列模型是Seq2Seq,这个概念相信大家都不陌生了,网上的讲解已经满天飞了,但是本文给大家带来的是我在Seq2Seq思想上开发的一个模型和新的架构,架构前面的文章已经说过很多次了,其是…

Python实现的二叉树结构示例

一、二叉树简介 二叉树是一类比较特殊的树,在二叉树中每个节点最多只有两个孩子,分为左孩子和右孩子,相对于树而言,二叉树的构建和使用都要简单得多。任何一棵树,都可以通过变换转换成一颗二叉树。 在 Python 中&…

数据结构实验任务七:基于广度优先搜索的六度空间理论验证

问题描述 “六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论 可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是 说,最多通过五个人你就能够认识任何一个陌生人。”假如给你一个社交网络图&#xf…

解决:AttributeError: module ‘copy’ has no attribute ‘copy’

解决:AttributeError: module ‘copy’ has no attribute ‘copy’ 文章目录 解决:AttributeError: module copy has no attribute copy背景报错问题报错翻译报错位置代码报错原因解决方法方法一方法二方法三今天的分享就到此结束了 背景 在使用之前的代…

谷歌正式发布最强 AI 模型 Gemini

2023年12月6日,谷歌公司宣布推出其被认为是规模最大、功能最强大的人工智能模型 Gemini。 Gemini将分为三个不同的套件:Gemini Ultra、Gemini Pro和Gemini Nano。 Gemini Ultra被认为具备最强大的能力,Gemini Pro则可扩展至多任务&#x…

RTL编码(2)——模块优化

一、顶层模块的划分 在RTL编码中,我们是以模块为单位进行设计的,模块之间的连接和嵌套关系对于电路结构有着很大的影响。一个好的系统设计中,我们应该使得模块尽量满足以下两个标准: 顶层模块扁平化内部模块层次化 1.1 顶层模块扁…

Python+requests+unittest+excel实现接口自动化测试框架

在刚刚进入测试行业的时候,最开始也是做功能测试,我想很多伙伴和我一样,觉得自动化测试都很高端,很神秘。迫不及待的想去学习作自动化测试。 以前比较常用数据库python做自动化,后面发现excel个人觉得更加适合&#x…