网络编程及练习

定义:

        在网络通信协议下,不同计算机上运行的程序进行的数据传输。计算机和计算机之间通过网络进行数据传输

        可以使用在java.net包下的技术开发出常见的网络应用程序

常见的软件架构:

C/S: Client/Server 客户端/服务器  在用户本地需要下载并安装客户端程序,在远程有一个服务器端程序

优点:画面精美,用户体验好

缺点:需要开发客户端,也需要开发服务端,用户需要下载和更新的时候太麻烦

B/S:Browser/Server 只需要一个浏览器,用户通过不同的网址,客户访问不同的服务器

优点:不需要开发客户端,只需要页面+服务端;用户不需要下载,打开浏览器就能使用;

缺点:如果应用过大,用户体验会受影响

三要素:IP 端口号 协议

IP:

        设备在网络中的地址,是唯一的标识

        定义:

           全称:Internet Protocol,是互联网协议地址,也称IP地址,是分配给上网设备的数字标签,通俗理解:上网设备在网络中的地址,是唯一的

        分类:

          IPv4 IPv6     

          IPv4:

         全称:Internet Protocol version 4,互联网通信协议第四版

         采用32位地址长度,分成4组 2^32方个ip

         点分十进制表示法:每8位表示为一个十进制数,中间用.隔开

         IPv6:

        全称:Internet Protocol version 6,互联网通信协议第六版

        采用128位地址长度,分成8组

        冒分十六进制表示法:将上面每一组用16进制表示,可以省略前面的0

        特殊情况:如果计算出的16进制表示形式中间有多个连续的0,可以用::表示

        地址分类形式:

                公网地址(万维网使用)和私有地址(局域网使用)

                192.168.开头的就是私有地址,范围为:192.168.0.0 -- 192.168.255.255,专门为组织机构内部使用,以此节省IP

                特殊IP地址:127.0.0.1,也可以是localhost:是回送地址也称本地回环地址,也称本机IP,永远只会寻找当前所在本机

   

                                                图来自黑马程序员网课 

端口号:

        应用程序在设备中唯一的标识

         由两个字节表示的整数,取值范围:0~65535,其中0~1023之间的端口号用于一些知名的网络服务或者应用,自己使用1024以上的端口号就可以了    

         注意:一个端口号只能被一个应用程序使用

协议:

        数据在网络中传输的规则,常见的协议有UDP,TCP,http,https,ftp

        OSI参考模型:世界互联协议标准,全球通信规范,

        TCP/IP参考模型(TCP/IP协议):事实上的国际标准

        

                                                                图来自黑马程序员网课 

TCP协议:传输控制协议(Transmission Control Protocol),它是面向连接通信协议,速度慢,没有大小限制,数据安全

         TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,通信之前要保证连接已经建立,通过Socket产生IO流来进行网络通信   

         

                                        图来自黑马程序员网课 

客户端代码:

package com.lazyGirl.netdemo.tcpdemo;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {

        //在创建该对象的同时会连接服务端,如果连不上,代码会报错
        Socket socket = new Socket("127.0.0.1",10086);

        //可以从连接通道中获取输出流
        OutputStream os = socket.getOutputStream();
        os.write("你好".getBytes());

        os.close();
        socket.close();
    }
}

服务端代码:

package com.lazyGirl.netdemo.tcpdemo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = new ServerSocket(10086);

        Socket socket = serverSocket.accept();

//        InputStream inputStream = socket.getInputStream();
//        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
//        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);


        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        int b;
        while ((b = br.read()) != -1) {
            System.out.print((char) b);
        }

        socket.close();
        serverSocket.close();

    }
}

输出:

UDP协议:用户数据报协议(User Datagram Protocol),它是面向无连接通信协议,速度快,有大小限制,一次最多发送64K,数据不安全,易丢失数据

                                   图来自黑马程序员网课 

 UDP的三种通信方式:

        单播:

        组播: 组播地址:224.0.0.0 ~ 239.255.255.255 其中224.0.0.0 ~ 224.0.0.255为预留的组播地址

        接收端1:

        

package com.lazyGirl.netdemo.udpdemo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {

        MulticastSocket ms = new MulticastSocket(10086);

        InetAddress group = InetAddress.getByName("224.0.0.1");
        ms.joinGroup(group);
        byte[] buf = new byte[1024];
        DatagramPacket dp = new DatagramPacket(buf, buf.length);
        ms.receive(dp);

        byte[] data = dp.getData();
        int len = data.length;
        String ip = dp.getAddress().getHostAddress();
        String name = dp.getAddress().getHostName();

        System.out.println("ip: " + ip + " name: " + name + " len: " + len + " data: " + new String(data));

        ms.close();

    }
}

发送端:

        

package com.lazyGirl.netdemo.udpdemo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class SendMessageDemo {
    public static void main(String[] args) throws IOException {

        MulticastSocket ms = new MulticastSocket();

        String s = "hello";
        byte[] buf = s.getBytes();
        InetAddress addr = InetAddress.getByName("224.0.0.1");
        int port = 10086;

        DatagramPacket dp = new DatagramPacket(buf, buf.length, addr, port);
        ms.send(dp);
        ms.close();


    }
}

     输出: 

        两个接收端都接收到了消息

         

                                                图来自黑马程序员网课 

        广播:255.255.255.255

        将上面的地址改成255.255.255.255即实现该局域网内所有主机都收到消息

常见的CMD命令:

        ipconfig: 查看本机ip地址

        ping: 检查网络是否连通

InetAddress:

        接收端:

package com.lazyGirl.netdemo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {


        //必须指定端口,且跟发送端口一致
        DatagramSocket socket = new DatagramSocket(10086);


        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        socket.receive(packet);

        byte[] data = packet.getData();
        int len = packet.getLength();
        InetAddress address = packet.getAddress();
        int port = packet.getPort();

        System.out.println("data " + new String(data,0,data.length));
        System.out.println("address " + address.getHostAddress());
    }
}

        receive函数会阻塞

        发送端: 

        

package com.lazyGirl.netdemo;

import java.io.IOException;
import java.net.*;

public class SendMessageDemo {
    public static void main(String[] args) throws IOException {

        DatagramSocket socket = new DatagramSocket();

        String str = "hello";
        byte[] buf = str.getBytes();

        InetAddress address = InetAddress.getByName("192.168.1.111");

        int port = 10086;
        DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);

        socket.send(packet);

        socket.close();
    }
}

输出:

聊天室:

发送端:

package com.lazyGirl.netdemo.netcase1;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class SendMessageDemo {
    public static void main(String[] args) throws IOException {

        DatagramSocket socket = new DatagramSocket();

        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("Enter your message");
            String message = scanner.nextLine();

            if ("886".equals(message)) {
                break;
            }

            byte[] data = message.getBytes();

            InetAddress address = InetAddress.getByName("lazyGril");

            int port = 10086;

            DatagramPacket packet = new DatagramPacket(data, data.length, address, port);

//            System.out.println("Sending Message");

            socket.send(packet);
        }

        socket.close();

    }
}

接收端:

package com.lazyGirl.netdemo.netcase1;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {


        DatagramSocket socket = new DatagramSocket(10086);

        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);

        while (true) {
            socket.receive(packet);
            byte[] data = packet.getData();
            int len = packet.getLength();
            int port = packet.getPort();
            String ip = packet.getAddress().getHostAddress();
            String name = packet.getAddress().getHostName();

            System.out.println("ip: " + ip + " name: " + name + " port: " + port + " len: " + len + " data: " + new String(data));
        }

    }
}

输出: 

 

练习: 

 case1: 

        客户端:发送一条数据,接收服务端反馈的消息并打印

        服务器:接收数据并打印,再给客户端反馈消息

        线程池版:

        客户端:

        

package com.lazyGirl.netdemo.test3;

import java.io.*;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {

        Socket socket = new Socket("127.0.0.1",10086);
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        byte[] buf = new byte[1024];
        int len;
        while ((len = bis.read(buf)) != -1) {
            bos.write(buf, 0, len);
        }
        socket.shutdownOutput();

        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String str = br.readLine();
        System.out.println(str);

        socket.close();
    }
}

服务端:

package com.lazyGirl.netdemo.test3;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;
import java.util.concurrent.*;

public class Server {
    public static void main(String[] args) throws IOException {

        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                3,
                16,
                60,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(2),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );

        ServerSocket serverSocket = new ServerSocket(10086);
        while (true) {
            Socket socket = serverSocket.accept();
            pool.submit(new MyRunnable(socket));

        }
    }
}
package com.lazyGirl.netdemo.test3;

import java.io.*;
import java.net.Socket;
import java.util.UUID;

public class MyRunnable implements Runnable {

    Socket socket;
    public MyRunnable(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try{
            BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
            String name = UUID.randomUUID().toString().toString().replaceAll("-", "");
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(name + ".txt"));
            int len;
            byte[] buf = new byte[1024];
            while ((len = bis.read(buf)) != -1) {
                bos.write(buf, 0, len);
            }

            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            bw.write("上传成功");
            bw.newLine();
            bw.flush();
            bw.close();
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if(socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

 输出:

 

 

         

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

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

相关文章

matplotlib 创建多个子图

有些时候我们需要用for循环来创建多个子图&#xff0c;来对比特征。现在已画出8组随机数来作为示例。 from matplotlib import pyplot as plt import numpy as np #设置画布大小 figplt.figure(figsize(20,8)) #解决中文乱码问题 plt.rcParams[font.sans-serif] [SimHei] fo…

视频智能分析平台智能边缘分析一体机安防监控平台打手机检测算法工作原理介绍

智能边缘分析一体机的打手机检测算法是一种集成了计算机视觉和人工智能技术的先进算法&#xff0c;专门用于实时监测和识别监控画面中的打手机行为。以下是关于该算法的详细介绍&#xff1a; 工作原理 1、视频流获取&#xff1a; 智能边缘分析一体机首先通过连接的视频监控设…

Ubuntu 18.04 安装 PCL 1.14.1

在进行科研项目时&#xff0c;我们常常需要将 C 和 Python 结合起来编程。然而&#xff0c;每次将 PCL&#xff08;Point Cloud Library&#xff09;的内容添加到 CMakeLists.txt 文件中时都会报错。在深入分析后&#xff0c;我们推测可能是当前使用的 PCL 1.8 版本与现有程序不…

【Linux】rouyiVue 项目部署全过程(含MySQL,Nginx等中间件部署)

查看nginx 进程命令 ps aux | grep server_name 1. 安装MySQL 1.1 下载压缩包 官网下载 1.2 解压 上传并解压好放在指定位置 创建soft文件夹 mkdir /soft上传文件&#xff0c;在该目录下再创建一个mysql文件夹&#xff0c;将安装包解压到新文件夹中 mkdir /soft/mysql-…

字符串函数的使用和模拟实现(四)

#include<string.h> int main() { char arr1[30]{“kongchao”}; char arr2[30]{“hello world”}; strncpy(arr2,arr1,9);//拷贝九个是因为第九个字节是’\0’ printf(“%s”,arr2); return 0; } strncpy函数模拟实现 #include<stdio.h> #include<a…

【前端vue3】TypeScrip-interface(接口)和对象类型

对象类型 定义对象需要用到interface&#xff08;接口&#xff09;&#xff0c;主要用来约束数据的类型满足格式 定义方式如下&#xff1a; interface Person {name: string;age: number; }如对象中与接口中的属性不一致会报错&#xff0c;必须保持一致 例如如下&#xff1a…

湖北建筑施工特种作业人员建筑起重信号司索工:年薪多少?

"湖北建筑施工特种作业人员建筑起重信号司索工&#xff1a;年薪多少&#xff1f;前景如何&#xff1f;" 2024湖北建筑施工特种作业人员建筑起重信号司索工 2024年湖北省建筑施工特种作业人员中的建筑起重信号司索工&#xff0c;是一项关键的工种&#xff0c;其在建筑…

让我来告诉初学者到底什么叫嵌入式系统?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;我们在刚刚开始学习电子学…

智慧校园的含义是什么

智慧校园&#xff0c;这一概念深深植根于现代科技土壤之中&#xff0c;是由人工智能、大数据、云计算等前沿技术深度融合所催生的教育领域革新典范。它不仅仅是一个物理空间&#xff0c;而是一个集成了智能感知、个性化服务、教育资源优化、未来教学模式、高效管理、便捷生活服…

用全志T113做了块多功能卡片电脑,成本只要60块

FunnyPi-T113是一款基于全志T113-S3/D1S处理器的完全开源多功能开发板&#xff0c;设计FunnyPi最初的目的是想借此T113卡片电脑来满足日常学习&#xff0c;并结合T113高效能和低功耗的特点&#xff0c;来满足像语音助手&#xff0c;智能家居屏幕、桌面摆件屏、博客服务器等嵌入…

【前端】[vue3] [uni-app] 组件样式击穿:deep

我是在开发uni-app时测试的思路&#xff0c;大家可以借鉴一下。 我这边测试的是uni组件&#xff0c;但是我觉得即便你用element-plus之类的&#xff0c;样式击穿的思路都相同。 我自定义了一个全局样式scss文件&#xff0c;并引入到了项目中。(如图) 利用vue3 中的 deep 方式…

极狐GitLab落户香港科学园并成功发布AI产品驭码CodeRider国际版

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

虚函数 虚表指针

虚函数表和虚表指针 1&#xff0c;虚函数的含义 用virtual声明类的成员函数称之为虚函数 2&#xff0c;作用 用于实现多态 存在继承关系&#xff0c;子类继承父类 子类重写了父类的virtual function 子类以父类的指针或者引用的身份出现 3&#xff0c;虚函数的实现原理 其中的…

html渲染的文字样式大小不统一解决方案

React Hooks 封装可粘贴图片的输入框组件&#xff08;wangeditor&#xff09;_react 支持图片拖拽的输入框-CSDN博客 这篇文章中的wangediter可粘贴图片的输入框&#xff0c;输入的文字和粘贴的文字在dangerouslySetInnerHTML渲染后出现了字体不统一的情况 在html中右键检查可…

openppp2 控制台回显窗口输出内容详解

本文介绍 openppp2 的控制窗口回显内容&#xff0c;以LINUX平台为例子&#xff0c;其它平台大同小异&#xff0c;区别只是多了一些额外的输出选项内容&#xff0c;本文会在下面补充。 在本文开始之前请查阅关联内容&#xff1a;openppp2 命令行接口详解-CSDN博客 控制台客户端…

自学鸿蒙HarmonyOS的ArkTS语言<三>路由跳转及传参

【官方文档传送门】 一、导入模块 import router from ohos.router二、新增页面配置 三、常用api 1、跳转到应用内的指定页面 build() {Row() {Button(下一页).onClick(() > {router.pushUrl({url: pages/Index2,params: {name: test}})})}.height(100%)}2、用应用内的某…

大模型如何改变世界?李彦宏:未来至少一半人要学会“提问题“

2023年爆火的大模型&#xff0c;对我们来说意味着什么&#xff1f; 百度创始人、董事长兼CEO李彦宏认为&#xff0c;“大模型即将改变世界。” 5月26日&#xff0c;李彦宏参加了在北京举办的2023中关村论坛&#xff0c;发表了题为《大模型改变世界》的演讲。李彦宏认为&#…

Transformer中的Self-Attention和Multi-Head Attention

2017 Google 在Computation and Language发表 当时主要针对于自然语言处理&#xff08;之前的RNN模型记忆长度有限且无法并行化&#xff0c;只有计算完ti时刻后的数据才能计算ti1时刻的数据&#xff0c;但Transformer都可以做到&#xff09; 文章提出Self-Attention概念&…

LeYOLO 用于目标检测的新型可扩展和高效CNN架构 | 最新轻量化SOTA! 5GFLOP下无对手!

本改进已集成到 YOLOv8-Magic 框架。 论文地址:https://arxiv.org/pdf/2406.14239 代码地址:https://github.com/LilianHollard/LeYOLO/tree/main 在深度神经网络中,计算效率对于目标检测至关重要,尤其是在新型模型更倾向于速度而非计算效率(浮点运算次数,FLOP)的情况下…

Transformer1--self attention

目录 一、 Vector set as 输入二、 模型输出&#xff08;三种&#xff09;1 **n-to-n**2 n-to-13 n-to-m 三、self-attention1、问题引入2、self-attention3 self-attention 原理介绍 一、 Vector set as 输入 一段声音讯号&#xff1a; 图结构&#xff08;graph&#xff09;…