第二十一章总结。。

计算机网络实现了堕胎计算机间的互联,使得它们彼此之间能够进行数据交流。网络应用程序就是再已连接的不同计算机上运行的程序,这些程序借助于网络协议,相互之间可以交换数据,编写网络应用程序前,首先必须明确网络协议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程序跟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();//创建面板对象center
        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() {//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);
    }
}

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

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

相关文章

状态机的练习:按键控制led灯

设计思路: 三个按键控制led输出。 三个按键经过滤波(消抖),产生三个按键标志信号。 三个led数据的产生模块(流水,跑马,闪烁模块),分别产生led信号。 这六路信号(三路按键信号&am…

4种常见的限流算法

限流算法 1、固定窗口 含义: 在一个固定长度的时间窗口内限制请求数量,每来一个请求,请求次数加一,如果请求数量超过最大限制,就拒绝该请求 优点: 实现简单,容易理解。 缺点: ①限流…

Ngxin实现301重定向映射

要实现将abc.love域名映射到http://baidu.com网站,并进行重定向,你需要在Nginx的配置文件中添加一个新的server块,如下所示: server {listen 80;server_name abc.com; #替换成自己的域名,记得要映射到这台服务器&…

element UI改写时间线组件为左右分布

2023.12.4今天我学习了如何使用element的时间线组件,效果如: 代码如下:(关键代码 v-if"item.send_type")判断左右分布情况。因为如果没有这个判断的话,其实会两边都有显示。可以用一个判断表示0显…

OpenEuler_22.03升级mongdb到7.0.4

使用命令:lscpu,查看cpu架构为aarch64为arm架构的一种执行状态。 所以我们直接下载arm的包安装即可。无需自己编译源码。 下载地址:https://www.mongodb.com/try/download/community 下载解压 wget https://fastdl.mongodb.org/linux/mong…

使用腾讯逆地理位置编码获取地理位置信息

文章目录 前言一、代码二、开放平台操作步骤1.开发者认证2.创建应用 总结 前言 最近项目中一个发帖的功能需要获取当前用户的发帖位置,由于是在APP内部使用,而且APP是使用uniApp开发的,所以在使用开放平台的SDK选用上有些麻烦,有…

echarts环形饼图

效果示例 代码汇总 pieCharts() {let data [];const providerResult [{name: 智诺, value: 23},{name: 海康, value: 5},{name: 大华, value: 5}, {name: 云科, value: 23},{name: 四信, value: 22},{name: 九物, value: 22}]let charts echarts.init(document.getElemen…

11K+ Star!图解计算机网络、操作系统、计算机组成、数据库!

大家好,我是 Java陈序员。 俗话说得好,面试造火箭,入职拧螺丝。我们在工作中,其实很少用到一些计算机底层知识,往往只要编码完事。但是,知其然还要知其所以然,我们不仅要做一个合格的“CV 工程…

Vector Quantized Diffusion Model for Text-to-Image Synthesis

Vector Quantized Diffusion Model for Text-to-Image Synthesis Shuyang Gu, University of Science and Technology of China, Microsoft, CVPR2022, Cited: 340, Code, Paper 1. 前言 我们提出了用于文本到图像生成的矢量量化扩散(Vector Quantized Diffusion Model&…

JavaScript如何实现按键音效、视频播放,标签分类切换横向滚动

1.使用HTML5的audio标签 &#xff08;音频播放&#xff09; <audio id"click-sound"><source src"audio/show.mp3" type"audio/mpeg"> </audio> <button id"button">按钮</button> var clickSound d…

北京市经信局局长姜广智带队调研三六零 强调大模型应与行业结合

12月6日&#xff0c;北京市经济和信息化局局长姜广智、副局长王磊带队走访调研三六零集团&#xff0c;就共促城市级数字安全基础设施项目落地&#xff0c;打造引领行业发展标杆项目&#xff0c;推动大模型落地应用赋能产业、行业发展等话题进行交流。360集团创始人周鸿祎接待来…

【FPGA】Quartus18.1打包封装网表文件(.qxp)详细教程

当我们在做项目的过程中&#xff0c;编写的底层Verilog代码不想交给甲方时怎么办呢&#xff1f;此时可以将源代码打包封装成网表文件&#xff08;.qxp&#xff09;进行加密&#xff0c;并且在工程中进行调用。 Quartus II的.qxp文件为QuartusII Exported Partition&#xff0c;…

探索 Linux Namespace:Docker 隔离的神奇背后

来自&#xff1a;探索云原生 https://www.lixueduan.com 原文&#xff1a;https://www.lixueduan.com/posts/docker/03-container-core/ 在 深入理解 Docker 核心原理&#xff1a;Namespace、Cgroups 和 Rootfs 一文中我们分析了 Docker 是由三大核心技术实现的。 今天就一起分…

C++多态(详解)

一、多态的概念 1.1、多态的概念 多态&#xff1a;多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 举个例子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b;学生买票时&am…

【离散数学】——期末刷题题库(等价关系与划分)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

漏洞复现-速达软件全系产品存在任意文件上传漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

12/07

#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//设置面板框this->resize(1000,580); //设置尺寸大小this->setFixedSize(1000,580); //固定尺寸大小this->setWindowFlag(Qt::Frameles…

XC4060 40V降5V/3.3V 0.6A小电流高耐压芯片 适用于单片机供电输出、电池供电设备

XC4060器件是高效率&#xff0c;同步降压DC/DC稳压器。具有较宽的输入范围&#xff0c;它们适用于广泛的应用&#xff0c;例如来自非稳压源的功率调节。他们的特点是一个长距离(500mQ/300mQ2型) 内部开关的效率最高 (92%)。Sum od (非A选项)和PWM模式(A选项)&#xff0c;工作频…

IDEA maven无法下载源代码处理

1、使用idea内置maven 在idea中新增一个mvn运行项,截图如下: 输入命令: dependency:resolve -Dclassifiersources 2、如果外部maven&#xff0c;不使用idea内部maven 在工程目录下命令行执行命令: mvn dependency:resolve -Dclassifiersources

simulink中 Data store memory、write和read模块及案例介绍

目录 1.Data store memory模块 2.data store write模块 3.data store read模块 4.仿真分析 4.1简单使用三个模块 4.2 模块间的调用顺序剖析 1.Data store memory模块 向右拖拉得到Data store read模块&#xff0c;向左拉得到Data write模块 理解&#xff1a;可视为定义变量…