Java学习网络编程

Java学习网络编程

大纲

  1. 网络相关概念
  2. IP地址
  3. 网络协议
  4. InetAdress
  5. Socket

具体案例

1. 网络相关概念

网络
在这里插入图片描述
网络通信
在这里插入图片描述

2. IP地址

在这里插入图片描述

在这里插入图片描述

域名

在这里插入图片描述

3.网络协议

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. InetAdress

在这里插入图片描述
获得本机的名字和IP

 public static void main(String[] args) throws UnknownHostException {InetAddress inetAddress = InetAddress.getLocalHost();System.out.println(inetAddress);}

获取指定主机名字或域名的信息

public static void main(String[] args) throws UnknownHostException {InetAddress host1 = InetAddress.getByName("  ");InetAddress host2 = InetAddress.getByName("www.baidu.com");System.out.println(host1);System.out.println(host2);}

gethostname 是获取主机名字。或者域名
getHostAddress 是获取IP地址

public static void main(String[] args) throws UnknownHostException {InetAddress host1 = InetAddress.getByName("挽天");InetAddress host2 = InetAddress.getByName("www.baidu.com");String f2 = host2.getHostAddress();String f1 = host1.getHostAddress();String name = host2.getHostName();System.out.println(f1);System.out.println(f2);System.out.println(name);}

5. Socket

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

TCP编程

在这里插入图片描述
当客户端连接服务端时,服务端是我们固定的端口,而客户端也有一个端口,只不过是TCP/IP协议随机分配的

结束标记
通用:调用socket对象的shutdownOutput()方法
其它:在写入时可以用writeNewLine()来进行结束标记,但这要求读取必须使用readline()方法
注意:写完过后记得使用flush方法刷新
在这里插入图片描述
服务端

public class socketServer {public static void main(String[] args) throws IOException {//服务端//在本机的9999端口监听,等待连接//前提该端口没有被占用//这个serverSocket,可以通过accept()来返回多个socket(高并发,多个客户端来连接服务器端)ServerSocket serverSocket = new ServerSocket(9999);//当没有客户端连接该端口时。程序会堵塞等待连接//  如果在客户端连接,就会返回Socket对象,程序继续执行Socket socket = serverSocket.accept();//创建一个和这个socket相关的输入流InputStream inputStream = socket.getInputStream();byte [] buf = new byte[1024];int length = 0;while ((length = inputStream.read(buf)) != -1){//根据读取到的实际长度读取字符串System.out.println(new String(buf,0,length));}//创建一个socket相关的输出流OutputStream outputStream = socket.getOutputStream();outputStream.write("hello,client".getBytes());outputStream.flush();//设置一个结束标记代表传入结束socket.shutdownOutput();//关闭流inputStream.close();outputStream.close();//关闭这个对象socket.close();serverSocket.close();}
}

客户端

public class socketClient {public static void main(String[] args) throws IOException {//客户端//连接服务器,里面写一个主机地址和端口,这里写的是本机//如果联机成功,返回一个socket对象Socket socket = new Socket(InetAddress.getLocalHost(),9999);//得到一个和socket对象关联的输出流OutputStream outputStream = socket.getOutputStream();//通过输出流,写入数据到数据通道outputStream.write("hello,server".getBytes());outputStream.flush();//设置一个结束标记socket.shutdownOutput();//获取和与socket相关联的输入流InputStream inputStream = socket.getInputStream();byte[] bytes = new byte[1024];int length;//创建循环读取数据while ((length = inputStream.read(bytes)) != -1){System.out.println(new String(bytes,0,length));}//关闭流对象,和socket,避免资源浪费inputStream.close();outputStream.close();socket.close();}
}

第二题:
在这里插入图片描述
服务端:

public class server1 {public static void main(String[] args) throws IOException {//创建等待接收ServerSocket serverSocket = new ServerSocket(8888);Socket socket = serverSocket.accept();//创建一个与socket相关的输入流BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());//把接收的数据存入一个byte数组byte[] bytes = tool.readArray(bis);String fileName = "D:\\java学习\\掉毛.jpg";//创建一个输出流BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileName));//把得到的数据写入磁盘bos.write(bytes);bos.close();//创建一个与socket相关的输出流BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//传递信息writer.write("收到图片");writer.flush();socket.shutdownOutput();//关闭流bis.close();writer.close();socket.close();serverSocket.close();}
}

客户端:

public class client1 {public static void main(String[] args) throws IOException {Socket socket = new Socket(InetAddress.getLocalHost(), 8888);String fileName = "D:\\java学习\\图片\\蛋糕.jpg";//创建一个输入流。从磁盘读取信息BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileName));//把读取到的信息存入一个字节数组byte [] bytes = tool.readArray(bis);//创建一个与socket相关的输出流BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());//传出数据bos.write(bytes);socket.shutdownOutput();//创建一个与socket相关的输入流InputStream inputStream = socket.getInputStream();//读取信息,并返回一个字符串String s = tool.readString(inputStream);//输出信息System.out.println(s);//关闭资源inputStream.close();socket.close();bos.close();bis.close();}
}

工具类:

public class  tool {public static byte [] readArray(InputStream is) throws IOException {ByteArrayOutputStream bos = new ByteArrayOutputStream();byte[] bytes = new byte[1024];int len;while ((len = is.read(bytes)) != -1){bos.write(bytes,0,len);}byte [] array = bos.toByteArray();bos.close();return array;}public static String readString (InputStream is) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(is));StringBuilder stringBuilder = new StringBuilder();String line;while ((line = reader.readLine()) != null){stringBuilder.append(line + "\r\n");}return stringBuilder.toString();}
}

netstat指令

在这里插入图片描述

UDP编程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接收端/发送端:

public class UDPReceive {public static void main(String[] args) throws IOException {//创建一个 DatagramSocket对象DatagramSocket datagramSocket = new DatagramSocket(9999);//构建一个DatagramPacket,传入bytes数组byte[] bytes = new byte[64 * 1024];DatagramPacket packet = new DatagramPacket(bytes, bytes.length);//调用接收方法接收数据//把接收到的数据,填充到DatagramPacket里面去//这个receive方法,没有接收到数据,程序就会阻塞datagramSocket.receive(packet);//进行拆包,并显示内容int length = packet.getLength();//得到长度byte [] data = packet.getData();//得到数组String s = new String (data,0,length);System.out.println(s);//发送内容byte[] bytes1 = "好的,明天见".getBytes();packet = new DatagramPacket(bytes1, bytes1.length, InetAddress.getByName("192.168.101.8"), 8888);datagramSocket.send(packet);//关闭流datagramSocket.close();}
}

发送端/接收端:

public class UDPSend {public static void main(String[] args) throws IOException {//创建一个DatagramSocket准备在8888端口发送,接收数据DatagramSocket datagramSocket = new DatagramSocket(8888);//将需要发送的数据封装到DatagramPacket//传入byte数组,数组长度,目标地址和端口byte[] bytes = "hello,明天吃火锅".getBytes();DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("192.168.101.8"), 9999);//发出数据datagramSocket.send(packet);//接收数据byte[] bytes1 = new byte[1024 * 64];packet = new DatagramPacket(bytes1, bytes1.length);datagramSocket.receive(packet);byte[] data = packet.getData();int length = packet.getLength();String s = new String(data,0,length);System.out.println(s);//关闭流datagramSocket.close();}
}

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

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

相关文章

前端学习之路(6) npm详解

npm 是什么? npm(node package manager):node.js 的包管理器,用于node插件管理(包括安装、卸载、管理依赖等) ,npm 是随同 node.js 一起安装的包管理工具,能解决 node.j…

小项目:蓝牙模块点亮RGB三色灯

在之前的教程中,我们学习了蓝牙模块的原理,并动手写了驱动,实现了串口的接收和发送。本次我们就来教大家如何使用蓝牙串口控制灯。这是一个简单的示例,展示了如何将蓝牙通信与硬件控制相结合,实现远程控制的功能。你也…

vue3+vite+ts 配置commit强制码提交规范配置 commitlint

配置 git 提交时的 commit 信息,统一提交 git 提交规范 安装命令: npm install -g commitizen npm i cz-customizable npm i commitlint/config-conventional commitlint/cli -D 文件配置 根路径创建文件 commitlint.config.js module.exports {// 继承的规…

【Linux】进程学习(一):基本认识

目录 1.基本概念2.初步理解3.描述进程-PCB3.1task_struct-PCB的一种3.2task_ struct内容分类 4.组织进程5.查看进程5.1通过ps指令查看5.2通过系统目录查看 6.通过系统调用获取进程的PID和PPID7.通过系统调用创建进程-fork初识 1.基本概念 课本概念:程序的一个执行实…

QGIS介绍

一.基本概念 QGIS的官方网站为:https://www.qgis.org Github地址:https://github.com/qgis/QGIS QGIS采用开源证书GNU GPLv2 (GNU General Public License version 2)发布,主要采用C语言开发,用户界面依赖Qt平台。 二…

PlantUML绘制UML图教程

UML(Unified Modeling Language)是一种通用的建模语言,广泛用于软件开发中对系统进行可视化建模。PlantUML是一款强大的工具,通过简单的文本描述,能够生成UML图,包括类图、时序图、用例图等。PlantUML是一款…

【Linux】线程

线程 我们常常会在linux中或者在操作系统这门课中听到进程和线程的名称,我们之前认识了进程的概念,现在我们来了解一下线程的概念 线程概念: 什么是线程 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定…

k8s 部署java应用 基于ingress+jar包

k8 集群ingress的访问模式 先部署一个namespace 命名空间 vim namespace.yaml kind: Namespace apiVersion: v1 metadata:name: ingress-testlabels:env: ingress-test 在部署deployment deployment是pod层一层封装。可以实现多节点部署 资源分配 回滚部署等方式。 部署的…

牛客网SQL进阶127: 月总刷题数和日均刷题数

官网链接: 月总刷题数和日均刷题数_牛客题霸_牛客网现有一张题目练习记录表practice_record,示例内容如下:。题目来自【牛客题霸】https://www.nowcoder.com/practice/f6b4770f453d4163acc419e3d19e6746?tpId240 0 问题描述 基于练习记录表…

基于SSM的图书馆预约占座系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的图书馆预约占座系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring…

java基础(2) 面向对象编程-java核心类

面向对象 面向对象对应的就是面向过程, 面向过程就是一步一步去操作,你需要知道每一步的步骤。 面向对象的编程以对象为核心,通过定义类描述实体及其行为,并且支持继承、封装和多态等特性 面向对象基础 面向对象编程&#xff0…

HARRYPOTTER: FAWKES

攻击机 192.168.223.128 目标机192.168.223.143 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -p- -A 192.168.223.143 开启了21 22 80 2222 9898 五个端口,其中21端口可以匿名FTP登录,好像有点说法,百度搜索一下发现可以用anonymous登录…

L1-088 静静的推荐

一、题目 二、解题思路 如果有的学生天梯赛成绩虽然与前一个人相同,但其参加过 PAT 考试,且成绩达到了该企业的面试分数线,则也可以接受——同一批次这样的人可以有多个!!!如果 pta 分数不低于 175 &#…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书添加模块UI设计实现

锋哥原创的PyQt6图书管理系统视频教程: PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

如何写一个其他人可以使用的GitHub Action

前言 在GitHub中,你肯定会使用GitHub Actions自动部署一个项目到GitHub Page上,在这个过程中总要使用workflows工作流,并在其中使用action,在这个使用的过程中,总会好奇怎么去写一个action呢,所以&#xff…

Linux线程 分离和同步与互斥 条件变量

Linux线程 分离和同步与互斥 条件变量 1. 分离线程2. 线程互斥与互斥量3. 线程同步与竞态条件4. pthread库与条件变量5. 生产者-消费者 1. 分离线程 什么是线程分离? 线程分离是指线程在结束时,操作系统会自动回收其资源,而无需其他线程显式地…

Java:内部类、枚举、泛型以及常用API --黑马笔记

内部类 内部类是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类。 当一个类的内部,包含一个完整的事物,且这个事物没有必要单独设计时&a…

[职场] 进入大数据领域需要掌握哪些软件 #其他#职场发展#职场发展

进入大数据领域需要掌握哪些软件 学习大数据首先我们要学习Java语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Java 大家都知道Java的方向有JavaSE、JavaEE、JavaME,学习大数据要学习那个方向呢? 只需要学习Java的…

2024 年 6 款值得推荐的 iOS 系统恢复软件

iPhone 以其时尚的设计、用户友好的界面和强大的性能而闻名。然而,没有任何技术能够避免错误和故障,iPhone 也不例外。作为 iPhone 用户,您可能遇到过各种可能导致设备故障的问题。虽然 Apple 提供了多种解决方案来解决这些问题,但…

算法练习-二叉搜索树中的搜索(思路+流程图+代码)

难度参考 难度:中等 分类:二叉树 难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。且所在课程未提供测试平台,故实现代码主要为自行测试的那种,以下内容均为个人笔记,旨…