网络编程及练习

定义:

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

        可以使用在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;}@Overridepublic 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);}}}}
}

 输出:

 

 

         

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

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

相关文章

打破数据分析壁垒:SPSS复习必备(四)

一、连续性变量的统计描述与参数估计 1、集中趋势的描述指标 均数&#xff08;Mean&#xff09; 中位数&#xff08;Median&#xff09; 众数&#xff08;Mode&#xff09; 总合&#xff08;Sum&#xff09; 2、离散趋势的描述指标 标准差&#xff08;Std. Deviation&#x…

STM32CubeMX WS2812B灯驱动

一、WS2812B 数据发送速度可达800Kbps。 数据协议采用单线归零码的通讯方式&#xff0c;像素点在上电复位以后&#xff0c;DIN端接受从控制器传输过来的数据&#xff0c;首先送过来的24bit数据被第一个像素点提取后&#xff0c;送到像素点内部的数据锁存器&#xff0c;剩余的…

openssl 命令行生成密钥对,生成hash,PSS填充签名,校验

生成密钥对 openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:4096 openssl rsa -pubout -in private_key.pem -out public_key.pem将源文件data.txt生成hash值&#xff08;sha-256&#xff09; openssl dgst -sha256 -binary data.txt > d…

MySQL进阶——SQL优化

目录 1插入数据 1.1 insert 1.2大批量插入数据 2主键优化 3 order by 优化 4 group by 优化 5 limit 优化 6 count 优化 6.1概述 6.2 count用法 7 update优化 1插入数据 1.1 insert 优化方案主要有3种 批量插入数据 Insert into tb_test values(1,Tom),(2,Cat)…

HarmonyOS开发知识 :扩展修饰器,实现节流、防抖、权限申请

引言 防重复点击&#xff0c;利用装饰器面向切面&#xff08;AOP&#xff09;的特性结合闭包&#xff0c;实现节流、防抖和封装权限申请。 节流 节流是忽略操作&#xff0c;在触发事件时&#xff0c;立即执行目标操作&#xff0c;如果在指定的时间区间内再次触发了事件&…

移动端 UI 风格,彰显不凡

移动端 UI 风格&#xff0c;彰显不凡

【车载AI音视频电脑】4/8路AHD 200万像素车载电脑SD卡录像机

产品主要特点&#xff1a; -支持4路实时高清AHD 1080P录像 -SD卡记录数据&#xff08;可支持2张大容量SD卡,最大支持单张256G&#xff09; -支持GPS全球定位, 可选模块 -支持WIFI高速自动下载功能, 可选模块 -内置3/4G模块&#xff0c;实时预览和远程管理&#xff0c; 可选…

汇凯金业:现货黄金投资平仓策略有哪些

现货黄金作为全球投资者广泛关注与参与的财富增值途径&#xff0c;其双向交易制度为市场参与者在不同行情下提供了盈利的可能。然而&#xff0c;如何在波动的市场中把握最佳的平仓时机&#xff0c;从而最大化收益&#xff0c;是所有投资者心中的疑问。正确的平仓策略可以说是现…

YYU系列电子引伸计

型号&#xff1a; YYU-50/10 YYU-50/25 YYU-25/10 YYU-100/10 YYU-100/25 轴向变形引伸计&#xff0c;适用于金属非金属材料的测试。用于测量弹性模量、规定非比例延伸强度、规定总延伸强度、各种延伸率、应变硬化指数等参数。 技术参数 1、应变片阻值&#xff1a;350欧…

vue+echarts ----中国地图 下拉选择省份地图中的省份区域高亮显示以及飞线图的效果

vueecharts ----中国地图 下拉选择省份地图中的省份区域高亮显示以及飞线图的效果 1、父组件核心代码&#xff1a;【/utils/area的详细数据】、【/utils/china详细数据】 <template><div class"center"><div class"digital"><el-se…

STM32学习笔记(十一)--SPI总线协议详解

概述&#xff1a;Serial Peripheral Interface&#xff0c;一组多从 传输速率比I2C快 但是线多 无应答 是一种同步&#xff08;具有时钟线需要同步时钟SCL&#xff09;、串行&#xff08;一位一位的往一个方向发送&#xff09;、全双工&#xff08;发送接收同时&#xff09;通…

Rocky9使用cockpitweb登陆时root用户无法登陆

Rocky9使用cockpitweb登陆时root用户无法登陆 [rootlvs ~]# vim /etc/cockpit/disallowed-users [rootlvs ~]# systemctl restart cockpit 取消disallowed-users中的root&#xff0c;即可访问 ip:9090 登陆。

计算机网络 —— 应用层(万维网)

计算机网络 —— 应用层&#xff08;万维网&#xff09; 万维网核心组成部分特点 URLHTTP版本请求消息结构响应消息结构工作流程 Cookie如何工作主要用途安全与隐私类型 Web缓存客户端缓存&#xff08;浏览器缓存&#xff09;服务器端缓存 今天我们来了解万维网&#xff1a; 万…

螺蛳粉店外卖配送小程序商城的效果为何

螺蛳粉是广西地区的特色美食&#xff0c;在当地有着大量实体餐饮店或品牌商&#xff0c;其单品消费率非常高&#xff0c;在外地也不乏自创品牌或加盟店等&#xff0c;其特殊的味道及吸引力也同样复购率高&#xff0c;客户除了线下到店外&#xff0c;也会购买袋/桶装螺蛳粉到家自…

构建有效的财务规划合作伙伴关系

在这个日益注重分类、定义和正规化的时代&#xff0c;财务规划与分析作为企业环境中发展最快的功能之一&#xff0c;已经从典型的数据管理角色逐步演变成企业框架中必不可少的身份。与其他新兴趋势一样&#xff0c;财务规划也开始采用更加创新的理念来吸引高技能投资&#xff0…

神经压缩文本训练:提升大型语言模型效率的新方法

随着大型语言模型&#xff08;LLMs&#xff09;在各个领域的广泛应用&#xff0c;其训练和部署的效率问题日益凸显。传统的子词标记化方法&#xff0c;如Byte Pair Encoding (BPE) 或 Unigram&#xff0c;虽然能够在一定程度上压缩文本&#xff0c;但其压缩率通常只有4倍左右。…

Kubernetes部署Kanboard看板管理平台

【云原生】Kubernetes部署Kanboard项目管理平台 文章目录 【云原生】Kubernetes部署Kanboard项目管理平台介绍资源列表基础环境一、检查k8s环境1.1、检查工作节点状态1.2、检查系统pod状态 二、编辑kanboard.yaml文件2.1、创建项目目录2.2、编辑kanboard.yaml文件 三、部署Kanb…

日常工作中常用的管理工具

日常工作中常用的管理工具 SWOT分析法&#xff1a; 帮你清晰地把我全局&#xff0c;分析自己在资源方面的优势域劣势&#xff0c;把握环境提供的机会&#xff0c;防范可能存在的风险与威胁&#xff0c;对我们的成功有非常重要的意义 PDCA循环规则&#xff1a; 每一项工作&#…

如何使用LiveTargetsFinder生成实时活动主机URL列表

关于LiveTargetsFinder LiveTargetsFinder是一款功能强大的实时活动主机生成工具&#xff0c;该工具可以为广大研究人员以自动化的形式生成可供分析和测试的实时活动主机URL列表&#xff0c;并通过MassDNS、Masscan和Nmap自动过滤出无法访问的主机。 我们只需要提供一个域名作…

代码随想录第30天|贪心算法

122.买卖股票的最佳时机II 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获得…