网络编程及练习

2024-06-22 06:04
文章标签 编程 练习 网络

本文主要是介绍网络编程及练习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

定义:

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

        可以使用在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.chinasem.cn/article/1083493

相关文章

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子